Linking different libraries for Debug and Release builds in Cmake on windows? Linking different libraries for Debug and Release builds in Cmake on windows? windows windows

Linking different libraries for Debug and Release builds in Cmake on windows?


According to the CMake documentation:

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...)

A "debug", "optimized", or "general" keyword indicates that the library immediately following it is to be used only for the corresponding build configuration.

So you should be able to do this:

add_executable( MyEXE ${SOURCES})target_link_libraries( MyEXE debug 3PDebugLib)target_link_libraries( MyEXE optimized 3PReleaseLib)


Somehow the answer from @Mike Willekes got CMake linking in the same target both release and debug for me :(

I only got this working by setting both configurations in one line, as suggested by @sakra in a related question - and doing so for every library that needed to be linked:

target_link_libraries ( app    debug ${Boost_FILESYSTEM_LIBRARY_DEBUG}    optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE} )target_link_libraries ( app    debug ${Boost_LOG_LIBRARY_DEBUG}    optimized ${Boost_LOG_LIBRARY_RELEASE} )target_link_libraries ( app    debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG}    optimized ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE} )# ...


I would like to add a few notes to the previous answers.

If you need to create a list of multiple files you want to link and store that in a cache variable then you need to add the optimized or debug specified before each and every library. This can be especially useful for larger makefiles/projects.

So for example you could do something like this:

set( MyFavLib_LIBRARIES     debug debug/module1.lib optimized release/module1.lib    debug debug/module2.lib optimized release/module2.lib )target_link_libraries( app ${MyFavLib_LIBRARIES} )