调试和发布库与CMAKE链接(VISUAL STUDIO)

Gab*_*iel 21 c++ cmake visual-studio-2010

已经有一个线程没有真正帮助.我希望能够链接例如Foo.lib 用于发布配置和Foo_d.lib调试配置,我怎么能做到这一点?如果我这样做:

target_link_libraries(MyEXE debug Foo_d)
target_link_libraries(MyEXE optimized Foo)
Run Code Online (Sandbox Code Playgroud)

那么我的项目中有两个库用于调试配置?为什么没有发布选项?

非常感谢!

小智 28

target_link_libraries采用一个列表,您不需要调用它两次.以下将有效:

target_link_libraries(MyEXE debug Foo_d optimized Foo)
Run Code Online (Sandbox Code Playgroud)

要回答另一个答案的评论中提出的问题,使用多个库的工作原理如下:

target_link_libraries(MyEXE
    debug Foo1_d optimized Foo1
    debug Foo2_d optimized Foo2)
Run Code Online (Sandbox Code Playgroud)

请注意,如果您还将库构建为CMake项目的一部分,则无需指定debug或optimize.CMake会为您选择合适的.


Nas*_*zta 24

解决方案是:

SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
Run Code Online (Sandbox Code Playgroud)


小智 15

当您的库是项目的一部分或者您使用config mode of find_packagecommand 导入它时没有问题(请参阅文档示例).万一你不能修改第三方所以它会产生<package>Config.cmake (它可能不会使用cmake工具或你不想这样做)答案是模仿这样的过程:

add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

target_link_libraries(MyEXE foo)
Run Code Online (Sandbox Code Playgroud)

请注意,与"debug"/"optimized"功能不同,此类方法不仅限于Debug/Release配置:

set_target_properties(foo PROPERTIES IMPORTED_LOCATION_MINSIZEREL "/path/to/foo-small.lib")
Run Code Online (Sandbox Code Playgroud)

你也有一些像INTERFACE_INCLUDE_DIRECTORIES的东西:

set_target_properties(foo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/foo/includes")

include_directories("/path/to/foo/includes") # this line not needed
target_link_libraries(MyEXE foo) # this command will add "/path/to/foo/includes" for you
Run Code Online (Sandbox Code Playgroud)

和传递链接:

add_library(boo STATIC IMPORTED)
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/boo-d.lib")
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/boo.lib")

add_library(foo STATIC IMPORTED)
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib")
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib")

set_target_properties(foo PROPERTIES INTERFACE_LINK_LIBRARIES boo) # foo depends on boo

target_link_libraries(MyEXE foo) # boo will be linked automatically
Run Code Online (Sandbox Code Playgroud)

当然,你可以使用普通的CMake命令状find_library,并find_package(... MODULE)估算位置,而不是硬编码他们.


Ale*_*ski 8

如果你有调试/发布库遵循某种模式,比如调试版的_d,你可以避免重复自己:

set (MY_LIBS
    foo
    bar
    baz
)

# Generate the list of files to link, per flavor.
set (LINK_LIST "")
foreach(x ${MY_LIBS})
    list (APPEND LINK_LIST debug ${x}_d optimized ${x})
endforeach()

target_link_libraries (mytarget
    commonlib1
    commonlib2
    ${LINK_LIST}
    )
Run Code Online (Sandbox Code Playgroud)

这将产生适当的

debug foo_d optimized foo
debug bar_d optimized bar
Run Code Online (Sandbox Code Playgroud)

target_link_libraries期望的行.


归档时间:

查看次数:

18867 次

最近记录:

10 年,3 月 前