【问题标题】:CMake: Different compile definitions for static and shared libraryCMake:静态和共享库的不同编译定义
【发布时间】:2018-03-06 11:47:19
【问题描述】:

在一个使用 cmake 的项目中,我构建了两个版本的库,一个是静态链接的,一个是动态链接的。对于单个源文件,我想在仅为共享库编译时传递不同的编译定义(即-Dfoo=bar)。

我知道 set_target_properties 可以将 COMPILE_DEFINITIONS 用于单个源,但我不知道如何仅为共享库添加该定义。

如何做到这一点?

编辑

为了阐明这个问题有何不同,我已经制作了同一个库的两个版本。

add_library(static_lib STATIC foo.cpp bar.cpp)
add_library(dyn_lib SHARED foo.cpp bar.cpp)

我想做的是在为dyn_lib 编译foo.cpp 时添加foo.cpp-Dbaz=True 编译的目标属性

【问题讨论】:

  • 我在许多项目中看到的常见模式是有 2 个目标 - 用于静态库和共享一个。使用 2 个目标,您可以为它们设置不同的标志。
  • @arrowd 我对cmake一无所知。我只知道如何将源目标作为add_library(${lib_name} (STATIC|SHARED) ${list of sources}) 添加到库中。你的意思是在源文件名和添加add_library命令之间做某种程度的间接?
  • 我的意思是,您应该对 add_library() 进行 2 次调用 - 一个用于静态库,另一个用于共享。

标签: c++ cmake shared-libraries


【解决方案1】:

库目标 dyn_lib 编译的对象添加定义-Dbaz=True 的最简单方法是使用target_compile_definition()

target_compile_definition(dyn_lib PRIVATE -Dbaz=True)

这实际上是为dyn_lib 目标设置COMPILE_DEFINITIONS 属性的较短版本。

set_target_properties(dyn_lib PROPERTIES COMPILE_DEFINITIONS -Dbaz=True)

要编译具有定义-Dbaz=True单个源文件,请使用set_source_files_properties()

set_source_files_properties(file.cpp PROPERTIES COMPILE_DEFINITIONS -Dbaz=True)

【讨论】:

  • 这为所有编译成dyn_lib的源定义了baz。我如何为单一来源定义baz
  • 我对你的评论有点困惑。为什么您希望符号仅对特定源文件有效,而源文件通常取决于您添加的特定库的目标?符号可以通过预处理器指令进行评估,它们是否存在(全局用于项目)。如何在源代码中使用它们取决于不同源代码中的预处理器指令的分叉。
  • @pythonicmetaphor,我为你的问题添加了答案。
猜你喜欢
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多