Debug and Release Library Linking with CMAKE (VISUAL STUDIO)

匿名 (未验证) 提交于 2019-12-03 01:29:01

问题:

There was already a Thread which did not help really. I want to be able to link for example Foo.lib for Release Config and Foo_d.lib for Debug Config , how can I achieve this? If I do this:

target_link_libraries(MyEXE debug Foo_d) target_link_libraries(MyEXE optimized Foo) 

then I have both libraries in my project for the debug config? Why is there no Release option?

Thanks alot!

回答1:

The solution is:

SET(LINK_LIBRARY optimized Foo debug Foo_d) target_link_libraries(MyEXE ${LINK_LIBRARY}) 


回答2:

target_link_libraries takes a list, you don't need to call it twice. The following will work:

target_link_libraries(MyEXE debug Foo_d optimized Foo) 

And to answer a question asked in the comments of another answer, working with multiple libraries works like so:

target_link_libraries(MyEXE     debug Foo1_d optimized Foo1     debug Foo2_d optimized Foo2) 

Note that if you also build the library as part of the CMake project, you don't need to specify debug or optimized. CMake will choose the right one for you.



回答3:

There is no problems when your library is a part of the project or you're importing it using config mode of find_package command (see documentation and example). In case you can't modify 3rd party so it will produce Config.cmake (it may not use cmake tool or you don't want to do it) the answer is to emulate such process:

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) 

note that unlike "debug"/"optimized" feature such approach is not limited to Debug/Release configs:

set_target_properties(foo PROPERTIES IMPORTED_LOCATION_MINSIZEREL "/path/to/foo-small.lib") 

also you've got some goodies like 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 

and transitive linking:

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 

Of course you can use regular cmake commands like find_library and find_package(... MODULE) to estimate locations instead of hardcoding them.



回答4:

If you have debug/release libs that follow a certain pattern, like _d on the debug ones, you can avoid repeating yourself with:

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}     ) 

This will generate the appropriate

debug foo_d optimized foo debug bar_d optimized bar 

lines that target_link_libraries expects.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!