CMake 创建具有不同定义的共享库和静态库
CMake creating shared and static library with different defines
我想使用 CMake 创建一个静态库和一个共享库来创建构建环境。此外,它应该创建一个 ANSI
和一个 UNICODE
版本。
我找到了这个帖子:Is it possible to get CMake to build both a static and shared version of the same library?
这告诉我可以使用多个 add_library
语句来实现此目的。当我尝试它时,它可以很好地创建库,但帖子没有告诉我如何根据构建的版本设置不同的 -D
选项。
我的 CMakeLists.txt
目前是这样的:
list(APPEND SUPPORT_SOURCE
dll_main.cpp
)
add_definitions(-DBUILD_SUPPORT_DLL)
add_library(support SHARED ${SUPPORT_SOURCE} )
add_library(support_s STATIC ${SUPPORT_SOURCE} )
add_library(support_u SHARED ${SUPPORT_SOURCE} )
add_library(support_su STATIC ${SUPPORT_SOURCE} )
毕竟,当我构建 DLL 时,函数需要静态版本中不应该有的 __declspec(dllexport)
声明。此外,要构建 UNICODE
变体,我需要传递 -DUNICODE
.
所以我需要知道构建了哪个版本,并针对各种目标使用适当的构建标志。
我不明白的另一件事是,我如何创建具有不同名称的调试版本。我通常使用 libname.lib
和 libname_d.lib
模式,因此我可以将所有可能的版本放在一个目录中以 link 反对。
您可以使用 target_compile_definitions
命令为每个目标设置编译器标志。例如:
target_compile_definitions(support PRIVATE MY_SHARED_DEFINITION)
target_compile_definitions(support_s PRIVATE MY_STATIC_DEFINITION)
至于向调试库添加后缀,您可以通过设置 CMake 变量 CMAKE_DEBUG_POSTFIX
:
来实现
set(CMAKE_DEBUG_POSTFIX _d)
这将导致所有不可执行的目标在调试时附加 _d
。如果你需要更细粒度的控制,你可以为个别目标设置DEBUG_POSTFIX
属性:
set_target_properties(support support_s PROPERTIES DEBUG_POSTFIX -dbg)
这将覆盖这两个目标的全局 CMAKE_DEBUG_POSTFIX
值,并改为给它们一个 -dbg
后缀。
我想使用 CMake 创建一个静态库和一个共享库来创建构建环境。此外,它应该创建一个 ANSI
和一个 UNICODE
版本。
我找到了这个帖子:Is it possible to get CMake to build both a static and shared version of the same library?
这告诉我可以使用多个 add_library
语句来实现此目的。当我尝试它时,它可以很好地创建库,但帖子没有告诉我如何根据构建的版本设置不同的 -D
选项。
我的 CMakeLists.txt
目前是这样的:
list(APPEND SUPPORT_SOURCE
dll_main.cpp
)
add_definitions(-DBUILD_SUPPORT_DLL)
add_library(support SHARED ${SUPPORT_SOURCE} )
add_library(support_s STATIC ${SUPPORT_SOURCE} )
add_library(support_u SHARED ${SUPPORT_SOURCE} )
add_library(support_su STATIC ${SUPPORT_SOURCE} )
毕竟,当我构建 DLL 时,函数需要静态版本中不应该有的 __declspec(dllexport)
声明。此外,要构建 UNICODE
变体,我需要传递 -DUNICODE
.
所以我需要知道构建了哪个版本,并针对各种目标使用适当的构建标志。
我不明白的另一件事是,我如何创建具有不同名称的调试版本。我通常使用 libname.lib
和 libname_d.lib
模式,因此我可以将所有可能的版本放在一个目录中以 link 反对。
您可以使用 target_compile_definitions
命令为每个目标设置编译器标志。例如:
target_compile_definitions(support PRIVATE MY_SHARED_DEFINITION)
target_compile_definitions(support_s PRIVATE MY_STATIC_DEFINITION)
至于向调试库添加后缀,您可以通过设置 CMake 变量 CMAKE_DEBUG_POSTFIX
:
set(CMAKE_DEBUG_POSTFIX _d)
这将导致所有不可执行的目标在调试时附加 _d
。如果你需要更细粒度的控制,你可以为个别目标设置DEBUG_POSTFIX
属性:
set_target_properties(support support_s PROPERTIES DEBUG_POSTFIX -dbg)
这将覆盖这两个目标的全局 CMAKE_DEBUG_POSTFIX
值,并改为给它们一个 -dbg
后缀。