cmake set静态库的命令语法

时间:2014-07-24 17:08:03

标签: debugging linker cmake release

我想在调试/发布模式中链接不同的库,在CMakeLists.txt中,我首先尝试了这个:

set(basic_lib 
    debug
        ws2_32 cryptlibd 
    optimized 
        ws2_32 cryptlib 
)

这不起作用,它总是在寻找 ws2_32 + cryptlibd ,即使在发布模式下也会导致链接错误。 我再次尝试:

set(basic_lib 
    optimized <---------- put optimized first
        ws2_32 cryptlib 
    debug
        ws2_32 cryptlibd 
)

现在它总是在发布/调试模式下链接到 ws2_32 + cryptlib

似乎cmake链接到首先定义的库。

然后我尝试了一个简单的:

set(basic_lib 
    debug
        cryptlibd 
    optimized 
        cryptlib 
)

只有一个lib链接,这次一切正常,为什么呢?

1 个答案:

答案 0 :(得分:2)

查看target_link_libraries的文档,特别是命令语法:

target_link_libraries(<target> [item1 [item2 [...]]]
                      [[debug|optimized|general] <item>] ...)

请注意每个项目如何分别指定debug / optimized / general。这就是命令的工作原理。

对于更精细的控制,您可以使用generator expressions来设置此类内容。

set(basic_libs
    $<$<CONFIG:Debug>:ws2_32d.lib cryptlibd.lib>
    $<$<NOT:$<CONFIG:Debug>>:ws2_32.lib cryptlib.lib>)
target_link_libraries(foo ${basic_libs})

请注意,这里的语义略有不同:您将获得调试配置的d ,同时为debug指定target_link_libraries适用于DEBUG_CONFIGURATIONS中列出的所有配置。