2016-05-10 2 views
1

Я создавал проекты C и C++ в средах unix с использованием CMake. Тем не менее, я хочу также начать компиляцию в MSVC, и я пытаюсь разобраться в документации cmake, но я застрял. Я продолжаю получать следующее сообщение, когда пытаюсь построить.Получение CMake для создания общей библиотеки для MSVC

LINK: фатальным LNK1104 ошибка: не удается открыть файл 'Debug \ MyLibrary.lib' [C: \ песочница \ Проекты \ CPP \ DummyChelloWorld \ построить \ ма inProgram.vcxproj]

Можете ли вы скажи мне, что я делаю неправильно?

CMakeLists.txt

cmake_minimum_required(VERSION 3.4) 
    project(helloWorld) 

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
    include(GenerateExportHeader) 

    ADD_LIBRARY(MyLibrary SHARED myShared.cpp) 

    set(SOURCE_FILES main.cpp) 

    GENERATE_EXPORT_HEADER(MyLibrary 
       BASE_NAME MyLibrary 
       EXPORT_MACRO_NAME MyLibrary_EXPORT 
       EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/MyLibrary_Export.h 
       STATIC_DEFINE MyLibrary_BUILT_AS_STATIC 
      ) 

    add_executable(mainProgram ${SOURCE_FILES}) 
    TARGET_LINK_LIBRARIES(mainProgram MyLibrary) 
    TARGET_INCLUDE_DIRECTORIES(mainProgram PUBLIC exports) 

main.cpp

#include "myShared.h" 

int main() { 
    sayHI(); 
    return 0; 
} 

myShared.cpp

#include <iostream> 
#include "myShared.h" 

using namespace std; 

void sayHI() { 
    cout << "Hello World lib" << endl; 
} 

myShared.h

#ifndef HELLOWORLD_HELLO_H 
    #define HELLOWORLD_HELLO_H 

    void sayHI(); 

    #endif //HELLOWORLD_HELLO_H 
+0

TARGET_INCLUDE_DIRECTORIES (экспорт mainProgram PUBLIC}) - Я думаю, что есть у в конце фигурная фигурная скобка. – sebenalern

+1

Спасибо и приятно поймать, но это была ошибка копирования и вставки. Я исправил его в своем посте. Все та же проблема. Большие глаза на детали. – loneraver

+0

Возможно, файл заблокирован. Попробуйте создать чистый каталог. – Antonio

ответ

2

Обращаясь мой комментарий в ответ

Для CMake версии> = 3,4

Просто используйте CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS:

cmake_minimum_required(VERSION 3.4) 
project(helloWorld) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 1) 

add_library(MyLibrary SHARED myShared.cpp) 

set(SOURCE_FILES main.cpp) 
add_executable(mainProgram ${SOURCE_FILES}) 
TARGET_LINK_LIBRARIES(mainProgram MyLibrary) 

Для CMake версии < 3,4

Вам нужно объявите свои функции/символы как экспортированные. Так что в вашем случае, вы должны изменить следующие файлы:

myShared.h

#ifndef HELLOWORLD_HELLO_H 
#define HELLOWORLD_HELLO_H 

#include "MyLibrary_Export.h" 

void MyLibrary_EXPORT sayHI(); 

#endif //HELLOWORLD_HELLO_H 

CMakeLists.txt

cmake_minimum_required(VERSION 3.4) 
project(helloWorld) 

set(CMAKE_CXX_STANDARD 11) 
include(GenerateExportHeader) 

add_library(
    MyLibrary 
    SHARED 
     myShared.cpp 
     myShared.h 
     MyLibrary_Export.h 
) 
GENERATE_EXPORT_HEADER( 
    MyLibrary 
    BASE_NAME MyLibrary 
    EXPORT_MACRO_NAME MyLibrary_EXPORT 
    EXPORT_FILE_NAME MyLibrary_Export.h 
    STATIC_DEFINE MyLibrary_BUILT_AS_STATIC 
) 
target_include_directories(MyLibrary PUBLIC "${CMAKE_CURRENT_BINARY_DIR}") 

set(SOURCE_FILES main.cpp) 
add_executable(mainProgram ${SOURCE_FILES}) 
TARGET_LINK_LIBRARIES(mainProgram MyLibrary) 

Я

  1. добавлено MyLibrary_EXPORT к вашей функции dec бъявлению
  2. добавил CMAKE_CURRENT_BINARY_DIR в общих библиотеки включают пути (чтобы указать на сгенерированный заголовок определений экспорта)
  3. использовал более кросс-платформенную CMAKE_CXX_STANDARD определения.

Альтернативные

Ссылки

+0

Он работает !!! Это все решило. Я не могу вас поблагодарить. Это заставляет меня желать, чтобы изучать эти удивительные трюки было намного проще. – loneraver

Смежные вопросы