c++ - CMake Visual Studio Debug/Release find_package -


i use cmake build on windows, linux, , osx. on windows, use .dll , .lib files have prebuilt , put in folder project/windows/bin, project/windows/include, , project/windows/lib. these folders house third party dependencies windows. in cmakelists.txt, use:

if(win32)   set(cmake_prefix_path ${project_source_dir}/windows) endif()  find_package(sdl2 required) find_package(glew required) 

it works able use 1 configuration of library. able link different configuration of library debug , release.

the question : how make when set visual studio project debug, use debug version of library , use release version of libray when set visual studio project release?

do need set /windows library directory differently?

thanks in advance

i'm sure, whether findsdl2 , findglew modules use provide imported targets. if so, might pick respective library both debug , release , should use imported target linking.

otherwise, have 2 options:

  1. explicitly use optimized <lib1_release> debug <lib1_debug> referenced @aichao in other question/answer:

    target_link_libraries(myconsumertarget                       public optimized <lib1_release>                              debug <lib1_debug>) 
  2. manually create imported library targets each external library , use them linking:

    if(not target external::lib1) # if required subsequent runs of cmake   add_library(external::lib1 shared imported global)   set_target_properties(external::lib1                         properties interface_include_directories "${project_source_dir}/windows/include"                                    imported_link_interface_languages "c"                                    imported_location_release "${project_source_dir}/windows/bin/<lib1_release>.dll"                                    imported_implib_release "${project_source_dir}/windows/lib/<lib1_release_importlib>.lib"                                    imported_location_debug "${project_source_dir}/windows/bin/<lib1_debug>.dll"                                    imported_implib_debug "${project_source_dir}/windows/lib/<lib1_debug_importlib>.lib")  endif()   target_link_libraries(myconsumertarget                        public external::lib1) 

personally, prefer latter less verbose in main cmakelists file. definition of different libraries can done in other files included via other means.
usually, have directory 3rdparty in projects cmakelists.txt file, pulls in external projects , defines such imported targets. in main cmake file can use these imported targets.


Comments