2017-09-25 104 views
2

在使用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.cppfoo.cpp编译时-Dbaz=True target属性。

+1

我在很多项目中看到的常见模式是有2个目标 - 静态库和共享目标。有了2个目标,你可以为它们设置不同的标志。 – arrowd

+0

@arrowd我对cmake很无知。我只知道如何将add_library($ {lib_name}(STATIC | SHARED)$ {源列表})添加到库中。你的意思是在源文件的名称和add_library命令之间进行一定程度的间接寻址? –

+1

我的意思是,你应该对'add_library()'进行2次调用 - 一个用于静态库,另一个用于共享。 – arrowd

回答

1

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'? –