gpt4 book ai didi

c++ - 使用 cmake/mingw 输出 DLL 而不是 .exe

转载 作者:行者123 更新时间:2023-11-30 05:43:50 25 4
gpt4 key购买 nike

我对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,您至少必须修改 header 以导出要导出的类/函数。来自 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 EXAMPLE_DLL MyClass
{
public:
MyClass() {};
virtual ~MyClass() {};
void func(void);
};

然后在构建dll时需要定义BUILDING_EXAMPLE_DLL。您可以在 CMake 中使用 add_definitions(-DBUILDING_EXAMPLE_DLL)

CMake 还支持使用 GENERATE_EXPORT_HEADER 生成导出 header

Doc for GenerateExportHeader

关于c++ - 使用 cmake/mingw 输出 DLL 而不是 .exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30083759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com