使用 cmake/mingw 输出 DLL 而不是 .exe
Output the DLL instead of .exe with cmake/mingw
我对cmake和mingw都不太熟悉
我有一些可以用它构建的源代码(构建过程在 mingw32-make
上运行良好)。问题是,我想输出 DLL 而不是 .exe 文件。
我有一些 CMakeList
文件,我相信它存储了我必须更改的配置(该部分应该负责为 Examples/
目录中的 .cpp 文件生成 .exe 文件,需要一些考虑依赖项):
# 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
选项。但具体在哪里?还是我没抓住要点?
要制作 dll,您需要 add_library(mydlltarget SHARED mysourcefiles)
而不是 add_executable(myexetarget mysourcefiles)
此外,要从可执行代码生成 dll,您至少必须修改 headers 以导出要导出的 classes/functions。从 building a dll with mingw 的文档中可以看出,该过程类似于 Visual Studio。在你有 header 的地方定义一个宏,在构建 dll 时转换为 __declspec(dllexport)
,在使用 dll 时转换为 __declspec(dllimport)
。
导出示例 header 如下所示:
#ifdef BUILDING_EXAMPLE_DLL
#define EXAMPLE_DLL __declspec(dllexport)
#else
#define EXAMPLE_DLL __declspec(dllimport)
#endif
那么你的class修改如下:
class EXAMPLE_DLL MyClass
{
public:
MyClass() {};
virtual ~MyClass() {};
void func(void);
};
那么在构建dll的时候需要定义EXAMPLE_DLL
。您可以在 CMake 中使用 add_definitions(-DEXAMPLE_DLL)
CMake 还支持使用 GENERATE_EXPORT_HEADER
生成导出 header
我对cmake和mingw都不太熟悉
我有一些可以用它构建的源代码(构建过程在 mingw32-make
上运行良好)。问题是,我想输出 DLL 而不是 .exe 文件。
我有一些 CMakeList
文件,我相信它存储了我必须更改的配置(该部分应该负责为 Examples/
目录中的 .cpp 文件生成 .exe 文件,需要一些考虑依赖项):
# 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
选项。但具体在哪里?还是我没抓住要点?
要制作 dll,您需要 add_library(mydlltarget SHARED mysourcefiles)
而不是 add_executable(myexetarget mysourcefiles)
此外,要从可执行代码生成 dll,您至少必须修改 headers 以导出要导出的 classes/functions。从 building a dll with mingw 的文档中可以看出,该过程类似于 Visual Studio。在你有 header 的地方定义一个宏,在构建 dll 时转换为 __declspec(dllexport)
,在使用 dll 时转换为 __declspec(dllimport)
。
导出示例 header 如下所示:
#ifdef BUILDING_EXAMPLE_DLL
#define EXAMPLE_DLL __declspec(dllexport)
#else
#define EXAMPLE_DLL __declspec(dllimport)
#endif
那么你的class修改如下:
class EXAMPLE_DLL MyClass
{
public:
MyClass() {};
virtual ~MyClass() {};
void func(void);
};
那么在构建dll的时候需要定义EXAMPLE_DLL
。您可以在 CMake 中使用 add_definitions(-DEXAMPLE_DLL)
CMake 还支持使用 GENERATE_EXPORT_HEADER