首页 文章

CMake Visual Studio Debug / Release find_package

提问于
浏览
1

我使用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 回答

  • 2

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

    否则,您有两种选择:

    • 在其他SO问题/答案中明确使用@aichao引用的 optimized <LIB1_release> debug <LIB1_debug>
    target_link_libraries(MyConsumerTarget
                          PUBLIC optimized <LIB1_release>
                                 debug <LIB1_debug>)
    
    • 为每个外部库手动创建导入的库目标,并使用它们进行链接:
    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)
    

    就个人而言,我更喜欢后者,因为它在主CMakeLists文件中不那么冗长 . 不同库的定义可以通过其他方式包含在其他文件中 .
    通常,我的项目中有一个 3rdparty 目录,其中包含 CMakeLists.txt 文件,该文件引入外部项目并定义此类导入目标 . 在主CMake文件中,我可以轻松使用这些导入的目标 .

相关问题