CMake创建具有不同定义的共享和静态库

时间:2015-06-03 19:03:16

标签: cmake

我想使用CMake创建静态和共享库来创建构建环境。此外,它应该创建ANSIUNICODE版本。

我发现了这个帖子: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.liblibname_d.lib,因此我可以将所有可能的版本放在一个目录中进行链接。

1 个答案:

答案 0 :(得分:2)

您可以使用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)

这将导致所有非可执行目标在内置Debug时附加_d。如果您需要更细粒度的控制,可以为各个目标设置DEBUG_POSTFIX属性:

set_target_properties(support support_s PROPERTIES DEBUG_POSTFIX -dbg)

这将覆盖这两个目标的全局CMAKE_DEBUG_POSTFIX值,并为其提供-dbg后缀。