【问题标题】:CMake creating shared and static library with different definesCMake创建具有不同定义的共享和静态库
【发布时间】:2015-08-18 03:49:38
【问题描述】:

我想使用 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,这样我就可以在一个目录中拥有所有可能的版本来链接。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以使用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 后缀。

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2011-01-10
      相关资源
      最近更新 更多