c++ - 让自定义 Find*.cmake 文件根据 visual studio 构建类型(调试/发布)查找不同的库

标签 c++ visual-c++ visual-studio-2013 cmake cmake-gui

我正在一个项目中创建一些 C++ 库(VS 术语中的解决方案),需要由其他两个项目使用。为此,我创建了一个 FindDQSAnalyticsInfra.cmake 文件,如下所示:

# DQSAnalyticsInfra
# -----
# Find the path to DQSAnalyticsInfra header files and libraries
#
# DEFINES
# ------
# DQSINFRA_ROOT - Root of the DQSAnalyticsInfra project
# DQSINFRA_INCLUDE_DIR - DQSAnalyticsInfra include directory
# DQSINFRA_LIBRARIES - Libraries required to link DQSAnalyticsInfra
# DQSINFRA_FOUND - Confirmation

set(DQSINFRA_LIBRARIES_LIST Utils Actor gtest)

find_path(DQSINFRA_INCLUDE_DIR Actor/Actor.h Utils/Log.h gtest/gtest/gtest.h
      ${DQSINFRA_ROOT}/include
      )

foreach(search_lib ${DQSINFRA_LIBRARIES_LIST}) 
    find_library(DQSINFRA_LIB NAMES ${search_lib}
                 PATHS
                 ${DQSINFRA_ROOT}/lib/Release #The problem is here
                )
    set(DQSINFRA_LIBRARIES ${DQSINFRA_LIBRARIES} ${DQSINFRA_LIB})
    if(DQSINFRA_LIB)
        unset(DQSINFRA_LIB CACHE)
        set(DQSINFRA_FOUND TRUE)
    else(DQSINFRA_LIB)
        set(DQSINFRA_FOUND FALSE)
        break()
    endif(DQSINFRA_LIB)
endforeach(search_lib)

if(DQSINFRA_INCLUDE_DIR AND DQSINFRA_LIBRARIES AND DQSINFRA_FOUND)
    set(DQSINFRA_FOUND TRUE)
    message(STATUS "Found DQSAnalyticsInfra. ")
    message(STATUS "Include Path: ${DQSINFRA_INCLUDE_DIR}")
    message(STATUS "Libraries ${DQSINFRA_LIBRARIES}")
else(DQSINFRA_INCLUDE_DIR AND DQSINFRA_LIBRARIES AND DQSINFRA_FOUND)
    set(DQSINFRA_FOUND FALSE)
    message(STATUS "DQSAnalyticsInfra not found.")
endif(DQSINFRA_INCLUDE_DIR AND DQSINFRA_LIBRARIES AND DQSINFRA_FOUND)

mark_as_advanced(DQSINFRA_INCLUDE_DIR DQSINFRA_LIBRARIES)

这个文件工作正常。问题在于,在此文件中使用的 find_library 命令中,我将路径硬编码为 ${DQSINFRA_ROOT}/lib/Release。这意味着我无法使用此文件链接到调试版本(我必须手动更改文件以使用 ${DQSINFRA_ROOT}/lib/Debug)。关于如何解决这个问题的任何想法。谢谢。

最佳答案

使用可以为 target_link_libraries 指定的 debugoptimized 关键字:

find_library(DQSINFRA_LIB_DEBUG NAMES ${search_lib} 
                 PATHS
                 ${DQSINFRA_ROOT}/lib/Debug
                )

find_library(DQSINFRA_LIB_RELEASE NAMES ${search_lib}
                 PATHS
                 ${DQSINFRA_ROOT}/lib/Release
                )

set(DQSINFRA_LIBRARIES optimized ${DQSINFRA_LIB_RELEASE} debug ${DQSINFRA_LIB_DEBUG})

关于c++ - 让自定义 Find*.cmake 文件根据 visual studio 构建类型(调试/发布)查找不同的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26254011/

相关文章:

visual-studio - 让 Doxygen 和 MSVC TODO 标签协同工作

sql-server - Visual Studio 2013 Ultimate 中的 SQL Server 对象资源管理器在哪里?

visual-studio-2013 - TFS Windows 资源管理器集成 - 在 VS 之外获取版本历史记录

c++ - 具有使用计数共享指针的多线程竞争条件

visual-studio - AVX512 和 MSVC 预处理器符号

c++ - 即将在 c++ 中添加的模块是否会修复/减轻对 pimpl 习语的需求?

visual-studio - 在 Visual Studio Express 2012 for Windows Desktop 中创建项目失败

azure - 我还需要第三方工具来管理 Azure 开发存储吗?

c++ - gcc 编译器优化影响代码

c++ - MFC中如何将GUI与逻辑分离?