【问题标题】:CMake Visual Studio Debug/Release find_packageCMake Visual Studio 调试/发布 find_package
【发布时间】:2016-12-14 20:33:58
【问题描述】:

我使用 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)

它可以工作,但我只能使用库的一种配置。我希望能够链接库的不同配置,如调试和发布。

问题是: 如何使当我将我的 Visual Studio 项目设置为调试时,它将使用库的调试版本并在我将 Visual Studio 项目设置为发布时使用该库的发布版本?

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

提前致谢

【问题讨论】:

标签: c++ visual-studio cmake


【解决方案1】:

我现在确定,您使用的 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)
    

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

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多