我对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
选项。但到底在哪里?或许我错过了这一点?
答案 0 :(得分:1)
要制作一个dll,您需要add_library(mydlltarget SHARED mysourcefiles)
而不是add_executable(myexetarget mysourcefiles)
另外,要从可执行代码中创建一个dll,您至少必须修改标头以导出要导出的类/函数。从building a dll with mingw的文档中可以看出,该过程与Visual Studio类似。如果您有标题,则定义一个宏,在构建dll时转换为__declspec(dllexport)
,使用dll时转换为__declspec(dllimport)
。
导出标题的示例如下所示:
#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);
};
然后你需要在构建dll时定义EXAMPLE_DLL
。您可以使用add_definitions(-DEXAMPLE_DLL)
此外,CMake还支持使用GENERATE_EXPORT_HEADER