CMake Visual Studio Debug / Release find_package

时间:2016-08-08 23:18:51

标签: c++ visual-studio cmake

我使用cmake在Windows,Linux和OSX上构建。在Windows上,我使用我已预先构建的.dll和.lib文件,并将其放在文件夹project / windows / bin,project / windows / include和project / windows / lib中。这些文件夹包含我对Windows的所有第三方依赖项。在我的CMakeLists.txt中,我使用:

if(WIN32)
  set(CMAKE_PREFIX_PATH ${PROJECT_SOURCE_DIR}/windows)
endif()

find_package(SDL2 REQUIRED)
find_package(GLEW REQUIRED)

它可以工作,但我只能使用库的一个配置。我希望能够链接库的不同配置,如Debug和Release。

问题是: 如何设置我的visual studio项目进行调试时,它将使用库的调试版本并在设置visual studio项目时使用libray的发行版本?

我是否需要以不同方式设置/ windows库目录?

提前致谢

1 个答案:

答案 0 :(得分:2)

我现在确定您使用的FindSDL2FindGLEW模块是否提供imported targets。如果是这样,那么可以将相应的库作为调试和发布来选择,并且应该使用导入的目标进行链接。

否则,您有两种选择:

  1. 在其他SO问题/答案中明确使用@aichao引用的optimized <LIB1_release> debug <LIB1_debug>

    target_link_libraries(MyConsumerTarget
                          PUBLIC optimized <LIB1_release>
                                 debug <LIB1_debug>)
    
  2. 为每个外部库手动创建导入的库目标,并使用它们进行链接:

    if(NOT TARGET External::lib1) # this if is required for 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)
    
  3. 就个人而言,我更喜欢后者,因为它在主CMakeLists文件中不那么冗长。不同库的定义可以通过其他方式包含在其他文件中完成 通常,我的项目中有一个目录3rdparty,其中包含CMakeLists.txt文件,该文件引入外部项目并定义此类导入目标。在主CMake文件中,我可以轻松使用这些导入的目标。