C++ 如何以编程方式获取使用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

我问了一个问题,为什么除了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 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时,它返回为空。