我想在调试/发布模式中链接不同的库,在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链接,这次一切正常,为什么呢?
答案 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
中列出的所有配置。