C++ 如何以编程方式获取使用CMake安装库的目录?
我问了一个问题,为什么除了VisualStudio之外,我的库都可以在每个编译器中找到。事实证明,在VisualStudio中,当您使用它构建库或任何东西时,它们被设置在调试或发布文件夹中 查看此zlib.cmake文件:C++ 如何以编程方式获取使用CMake安装库的目录?,c++,visual-studio,cmake,C++,Visual Studio,Cmake,我问了一个问题,为什么除了VisualStudio之外,我的库都可以在每个编译器中找到。事实证明,在VisualStudio中,当您使用它构建库或任何东西时,它们被设置在调试或发布文件夹中 查看此zlib.cmake文件: SET_PROPERTY(DIRECTORY PROPERTY "EP_BASE" ${ep_base}) SET(zlib_GIT_TAG "origin/master") # If CMake ever allows overriding the checkout co
SET_PROPERTY(DIRECTORY PROPERTY "EP_BASE" ${ep_base})
SET(zlib_GIT_TAG "origin/master")
# If CMake ever allows overriding the checkout command or adding flags,
# git checkout -q will silence message about detached head (harmless).
ExternalProject_Add(Zlib_external_download
GIT_REPOSITORY "https://github.com/madler/zlib.git"
GIT_TAG ${zlib_GIT_TAG}
PATCH_COMMAND ""
INSTALL_DIR ""
INSTALL_COMMAND ""
CMAKE_CACHE_ARGS
-DCMAKE_VERBOSE_MAKEFILE:BOOL=${CMAKE_VERBOSE_MAKEFILE}
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON
-DCMAKE_CXX_FLAGS:STATIC=${CMAKE_CXX_FLAGS}
-DCMAKE_C_FLAGS:STATIC=${CMAKE_C_FLAGS}
-DDO_ZLIB_MANGLE:BOOL=${DO_ZLIB_MANGLE}
)
ExternalProject_Get_Property(Zlib_external_download BINARY_DIR)
ExternalProject_Get_Property(Zlib_external_download SOURCE_DIR)
SET(Zlib_LIBRARY_DIR ${BINARY_DIR} CACHE PATH "")
SET(Zlib_INCLUDE_DIR ${SOURCE_DIR} CACHE PATH "")
add_library(Zlib STATIC IMPORTED)
MESSAGE(STATUS "Zlib_LIBRARY_DIR: ${Zlib_LIBRARY_DIR}")
我将库目录设置为外部项目的二进制目录,将include目录设置为外部项目的源目录。这适用于gcc、MinGW和Xcode。但是,由于外部项目是在Visual Studio中构建的,因此实际的库和dll被放置在${BINARY\u DIR}/Debug}
或${BINARY\u DIR}/Release}
中,具体取决于构建项目的方式
作为创可贴,我已经提出:
if(MSVC)
if(EXISTS ${Zlib_LIBRARY_DIR}/Debug)
set(Zlib_LIBRARY_DIR ${Zlib_LIBRARY_DIR}/Debug)
elseif(EXISTS ${Zlib_LIBRARY_DIR}/Release)
set(Zlib_LIBRARY_DIR ${Zlib_LIBRARY_DIR}/Release)
endif()
endif()
这是一个可怕的解决方案,因为调试和发布都可以构建,如果在构建调试时选择构建发布,它将链接到调试库而不是发布库
有没有办法找到库的位置,这样我就可以正确设置路径,这样它就可以干净地交叉编译?或者有没有一种方法可以告诉我是否正在构建调试或发布,这样我就可以将路径链接到
if(MSVC)
也许可以帮助你。@Lasall,CMAKE_BUILD_TYPE不会给你Visual Studio的构建类型。当在CMAKE中调用CMAKE_BUILD_TYPE时,它返回为空或空白。也许可以帮助您。@Lasall,CMAKE_BUILD_TYPE不会提供Visual Studio的生成类型。当在CMAKE中调用CMAKE_BUILD_TYPE时,它返回为空。