Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake Visual Studio调试/发布查找程序包_C++_Visual Studio_Cmake - Fatal编程技术网

C++ CMake Visual Studio调试/发布查找程序包

C++ CMake Visual Studio调试/发布查找程序包,c++,visual-studio,cmake,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) endi

我使用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库目录


提前感谢

我现在确定您使用的
FindSDL2
FindGLEW
模块是否提供。如果是这样的话,那么您可能会选择相应的库作为debug和release,并且您应该使用导入的目标进行链接

否则,您有两个选择:

  • 明确使用@aichao在其他SO问题/答案中引用的
    优化调试

    target_link_libraries(MyConsumerTarget
                          PUBLIC optimized <LIB1_release>
                                 debug <LIB1_debug>)
    
    target\u link\u库(MyConsumerTarget
    公共优化
    调试)
    
  • 为每个外部库手动创建导入的库目标,并将其用于链接:

    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)
    
    if(非TARGET External::lib1)#后续运行CMake时需要此if
    添加库(外部::lib1共享导入全局)
    设置\u目标\u属性(外部::lib1
    属性接口\u INCLUDE\u目录“${PROJECT\u SOURCE\u DIR}/windows/INCLUDE”
    已导入链接接口语言“C”
    导入的位置发布“${PROJECT\u SOURCE\u DIR}/windows/bin/.dll”
    导入的执行版本“${PROJECT\u SOURCE\u DIR}/windows/lib/.lib”
    导入的位置调试“${PROJECT\u SOURCE\u DIR}/windows/bin/.dll”
    导入的_IMPLIB_调试“${PROJECT_SOURCE_DIR}/windows/lib/.lib”)
    endif()
    目标链接库(MyConsumerTarget)
    公共外部:lib1)
    

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

    是否解决了您的问题?