我使用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库目录?
提前致谢
答案 0 :(得分:2)
我现在确定您使用的FindSDL2
和FindGLEW
模块是否提供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文件中,我可以轻松使用这些导入的目标。