2015-05-06 4 views
1

Я не очень хорошо знаком с cmake и mingw.Выведите DLL вместо .exe с cmake/mingw

У меня есть исходный код, который можно построить с ним (и процесс сборки отлично работает с mingw32-make). Проблема в том, что я хотел бы выводить библиотеки DLL, а не файлы .exe.

У меня есть CMakeList файла, который я считаю, сохраняет конфигурацию я должен изменить (эта часть должна отвечать производить файлы с расширением EXE для файлов .cpp в Examples/ каталоге, принимая некоторые зависимости во внимание):

# C examples 
if(PSMOVE_BUILD_EXAMPLES) 
    foreach(EXAMPLE example multiple dump_calibration battery_check) 
     add_executable(${EXAMPLE} examples/c/${EXAMPLE}.c) 
     target_link_libraries(${EXAMPLE} psmoveapi) 
    endforeach() 

    if(PSMOVE_BUILD_TRACKER AND PSMOVE_BUILD_TUIO_SERVER) 
     include_directories(${PSMOVEAPI_SOURCE_DIR}/external/TUIO_CPP/TUIO) 
     include_directories(${PSMOVEAPI_SOURCE_DIR}/external/TUIO_CPP/oscpack) 
     add_executable(tuio_server examples/c/tuio_server.cpp 
      external/TUIO_CPP/TUIO/TuioClient.cpp 
... 
      external/TUIO_CPP/oscpack/ip/win32/NetworkingUtils.cpp 
      external/TUIO_CPP/oscpack/ip/win32/UdpSocket.cpp) 
     set_target_properties(tuio_server PROPERTIES 
      COMPILE_FLAGS -DOSC_HOST_LITTLE_ENDIAN) 
     target_link_libraries(tuio_server psmoveapi psmoveapi_tracker) 
    else() 
     # Disable the TUIO Server if we don't build the tracker 
     set(PSMOVE_BUILD_TUIO_SERVER OFF) 
    endif() 

    if(PSMOVE_BUILD_TRACKER) 
     foreach(EXAMPLE distance_calibration) 
      add_executable(${EXAMPLE} examples/c/${EXAMPLE}.c) 
      target_link_libraries(${EXAMPLE} psmoveapi psmoveapi_tracker) 
     endforeach() 
    endif() 
endif() 

Я думаю, я должен добавить -DBUILDING_EXAMPLE_DLL и -shared вариантов где-то. Но где именно? Или, может быть, мне не хватает смысла?

+0

Чтобы сделать DLL вам нужно 'add_library (mydlltarget ОБЩИХ mysourcefiles)' не 'add_executable (myexetarget mysourcefiles) ' – drescherjm

+0

Вау, это будет единственное изменение здесь? Достаточно мощный;) – PolGraphic

+0

Возможно, вам нужно изменить заголовки для классов, которые вы хотите экспортировать. Я не знаком с mllw dll, поэтому я не могу с этим поделать. – drescherjm

ответ

1

Чтобы сделать DLL вам нужно add_library(mydlltarget SHARED mysourcefiles) вместо add_executable(myexetarget mysourcefiles)

Кроме того, чтобы сделать библиотеку DLL из кода, который был исполняемым вы как минимум должны изменить ваши заголовки экспортировать классы/функции, которые вы хотите экспортируемые. Из документации для building a dll with mingw кажется, что процесс похож на Visual Studio. Если у вас есть заголовок, определяйте макрос, который преобразуется в __declspec(dllexport) при построении dll и __declspec(dllimport) при использовании dll.

Образец заголовка экспорта выглядит следующим образом:

#ifdef BUILDING_EXAMPLE_DLL 
#define EXAMPLE_DLL __declspec(dllexport) 
#else 
#define EXAMPLE_DLL __declspec(dllimport) 
#endif 

Тогда модификация для вашего класса, как это:

class EXAMPLE_DLL MyClass 
{ 
public: 
     MyClass() {}; 
     virtual ~MyClass() {}; 
     void func(void); 
}; 

Затем вам нужно определить EXAMPLE_DLL при создании библиотеки DLL. Вы можете сделать это в CMake с add_definitions(-DEXAMPLE_DLL)

Также CMake предоставляет поддержку создания заголовка экспорта с GENERATE_EXPORT_HEADER

Doc for GenerateExportHeader

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