CMAKE如何使用不同的标志编译静态/对象库

时间:2018-04-23 11:15:05

标签: cmake

问题:2个可执行文件,1个核心库,if / defs在里面

在ĽubomírCarik的帮助下

UPD2

每个可执行文件都设置自己的预处理程序标志 最初,创建了目标库

add_library(common_library STATIC ${__SOURCES} ${__HEADERS})

common_library 代码(静态库,自己的cmake文件)具有预处理器条件

#if defined(MY_DEFINE_1)
// specific code #1 
#elif defined (MY_DEFINE_2)
// specific code #2 
#else
// error
#endif

我在使用CMake准备这样的配置时遇到问题。库没有看到定义。 第一个可执行文件(自己的cmake):

target_compile_definitions(common_library PRIVATE -DMY_DEFINE_1)
add_executable(BINARY_1  ${bin1_sources}   )
add_dependencies(BINARY_1 common_library)

第二个可执行文件(自己的cmake):

target_compile_definitions(common_library PRIVATE -DMY_DEFINE_2)
add_executable(BINARY_2  ${bin2_sources}   )
add_dependencies(BINARY_2 common_library)

common_library 只构建一次,有2个定义。它应该为每个二进制文件单独构建。

2 个答案:

答案 0 :(得分:1)

您应该使用target_compile_optionstarget_compile_definitions代替全局' add_definitions'。并为library_1和library_2设置不同的定义。

答案 1 :(得分:1)

由于您正在尝试更改库上的编译器标志,因此您需要多次构建库。您现在正在做的是多次更改库上的标志,这就是您在构建中看到两组编译器定义的原因。

解决问题的最简单方法是创建两个库条目,每个条目都有自己的标记。这是我能想到的最小的例子:

project("sample"
    LANGUAGES
        C
)

add_library(lib1 STATIC foo.c)
target_compile_definitions(lib1
    PRIVATE -DCOND=1
)
add_library(lib2 STATIC foo.c)
target_compile_definitions(lib2
      PRIVATE -DCOND=0
)

我的foo.c看起来像这样:

#if COND
#warning "case 1"
#else
#warning "case 2"
#endif

void foo() { }

构建如下:

$ make
Scanning dependencies of target lib1
[ 25%] Building C object CMakeFiles/lib1.dir/foo.o
/tmp/so/static-lib/foo.c:2:2: warning: #warning "case 1" [-Wcpp]
 #warning "case 1"
  ^~~~~~~
[ 50%] Linking C static library liblib1.a
[ 50%] Built target lib1
Scanning dependencies of target lib2
[ 75%] Building C object CMakeFiles/lib2.dir/foo.o
/tmp/so/static-lib/foo.c:4:2: warning: #warning "case 2" [-Wcpp]
 #warning "case 2"
  ^~~~~~~
[100%] Linking C static library liblib2.a
[100%] Built target lib2

如果大多数库代码相同,则可以通过使用三个库来限制编译时间(例如,真正通用的代码,然后是仅包含条件编译内容的库)。