正在解决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/boost/usr/local/include,由于我不太理解的原因,这些是用于构建的头,尽管它们与~/.linuxbrew/lib/boost中的库不兼容。

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

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

target_include_directories (octopus BEFORE PRIVATE ${Boost_INCLUDE_DIR})

最新更新