c++ - 解决 CMake 中的竞争包含目录

标签 c++ cmake

我有一个 C++ 项目需要两个外部库(boost 和 htslib)。我将库链接到我的项目目标 octopus,如下所示:

find_package (Boost 1.65 REQUIRED COMPONENTS ${REQUIRED_BOOST_LIBRARIES} REQUIRED)
if (Boost_FOUND)
    target_include_directories (octopus PRIVATE ${Boost_INCLUDE_DIR})
    target_link_libraries (octopus ${Boost_LIBRARIES})
endif (Boost_FOUND)
find_package (HTSlib 1.4 REQUIRED)
if (HTSlib_FOUND)
    target_include_directories (octopus PRIVATE ${HTSlib_INCLUDE_DIRS})
    target_link_libraries (octopus ${HTSlib_LIBRARIES})
endif (HTSlib_FOUND)

boosthtslib 通常都安装在/usr/local 中,因此在/usr/local 中有头文件/包括。但是,用户可以通过指定 CMake 变量 BOOST_ROOTHTSLIB_ROOT 来指定替代库位置。

问题是,如果只给其中一个库指定了一个替代位置,那么另一个链接库的包含目录中的头文件(例如在 /usr/local/include 中)会得到这两个库都包含在内,如果安装了无法比较的库版本,则编译可能会失败。例如,如果我将 BOOST_ROOT 设置为 ~/.linuxbrew,则 Boost_INCLUDE_DIR 正确设置为 ~/.linuxbrew/include,但是 HTSlib_INCLUDE_DIRS/usr/local/include,其中包含 /usr/local/include/boost,出于我不知道的原因不太明白,这些是用于构建的头文件,尽管它们与 ~/.linuxbrew/lib/boost 中的库不兼容。

如何确保链接库的包含目录仅用于该库?

最佳答案

考虑哪个头文件是包含目录顺序的问题——编译器通常会考虑任何包含文件夹中与给定名称匹配的第一个文件。虽然您不能告诉编译器在一个特定目录中查找一个文件并在另一个特定目录中查找另一个文件,但您可以在某种程度上确定包含目录的顺序。在您的情况下,听起来应该先检查 boost 包含目录,因此请尝试 target_include_directories 中的 BEFORE 关键字打电话,像这样:

target_include_directories (octopus BEFORE PRIVATE ${Boost_INCLUDE_DIR})

关于c++ - 解决 CMake 中的竞争包含目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53813621/

相关文章:

cmake - 未知的 CMake 命令 "ExternalProject_Add"

c++ - 使用 cmake 时出错

c++ - 将 google APIs 库添加到 cmake build

c++ - 如何模拟方法模板的虚拟性

c++ - 将类划分为定义和实现不纯粹是为了编译时的目的吗?

c++ - 具有值和指针的数组

c++ - cmake 使用 find_package 传播依赖项

xcode - 如何在 CMake 中为特定配置设置 Xcode 属性?

c++ - 为什么 QWebFrame::evalutateJavaScript 在这种情况下什么都不做?

c++ - 调试导致异常?