解决CMake中的竞争包含目录

时间:2018-12-17 10:49:11

标签: 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/include中具有头文件。但是,用户可以通过指定CMake变量BOOST_ROOTHTSLIB_ROOT来指定备用库位置。

问题是,如果仅给一个库提供了备用位置,则两个链接库都将包含另一个链接库的include目录中的头文件(例如,/usr/local/include中的头文件),并且它们是不可比的安装了该库的版本后,编译可能会失败。例如,如果我将BOOST_ROOT设置为~/.linuxbrew,则Boost_INCLUDE_DIR正确设置为~/.linuxbrew/include,但是HTSlib_INCLUDE_DIRS/usr/local/include,其中包含{{ 1}},而且由于我不太了解的原因,这些是用于构建的标头,即使它们与/usr/local/include/boost中的库也不兼容。

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

1 个答案:

答案 0 :(得分:0)

哪个头文件被认为是包含目录顺序的问题-编译器通常会考虑与任何包含文件夹中的给定名称匹配的第一个文件。虽然您不能告诉编译器在一个特定目录中查找一个文件,而在另一特定目录中查找另一个文件,但是您可以在某种程度上确定include目录的顺序。听起来像是您的情况,应该先检查boost include目录,然后在target_include_directories调用中尝试使用BEFORE关键字,如下所示:

target_include_directories (octopus BEFORE PRIVATE ${Boost_INCLUDE_DIR})