CMake:静态和共享库的不同编译定义
问题描述:
在使用cmake的项目中,我构建了两个版本的库,一个是静态的,一个是动态链接的。对于单个源文件,我只想在编译共享库时传递不同的编译定义(即-Dfoo=bar
)。CMake:静态和共享库的不同编译定义
我知道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
仅 target属性。
答
为dyn_lib
编译的对象添加定义-Dbaz=True
最简单的方法是使用target_compile_definition()。
target_compile_definition(dyn_lib PRIVATE -Dbaz=True)
这实际上是设置COMPILE_DEFINITIONS
属性dyn_lib
目标的一个较短的版本。
set_target_properties(dyn_lib PROPERTIES COMPILE_DEFINITIONS -Dbaz=True)
+0
这个定义了所有被编译到'dyn_lib'的源文件的'baz'。我将如何为单一来源定义'baz'? –
我在很多项目中看到的常见模式是有2个目标 - 静态库和共享目标。有了2个目标,你可以为它们设置不同的标志。 – arrowd
@arrowd我对cmake很无知。我只知道如何将add_library($ {lib_name}(STATIC | SHARED)$ {源列表})添加到库中。你的意思是在源文件的名称和add_library命令之间进行一定程度的间接寻址? –
我的意思是,你应该对'add_library()'进行2次调用 - 一个用于静态库,另一个用于共享。 – arrowd