У меня есть проект на 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)
И boost
, и htslib
обычно устанавливаются в /usr/local
и поэтому имеют заголовочные файлы в /usr/local/include
.Однако пользователи могут указать альтернативные расположения библиотек, указав переменные CMake BOOST_ROOT
и HTSLIB_ROOT
.
Проблема заключается в том, что если только одной из библиотек предоставляется альтернативное расположение, то файлы заголовков в каталоге includeдругой связанной библиотеки (например, в /usr/local/include
) включаются для обеих библиотек, и если установлены несопоставимые версии библиотеки, компиляция может завершиться неудачно.Например, если я установлю BOOST_ROOT
на ~/.linuxbrew
, тогда Boost_INCLUDE_DIR
будет правильно установлен на ~/.linuxbrew/include
, но HTSlib_INCLUDE_DIRS
будет /usr/local/include
, который содержит /usr/local/include/boost
, и по причинам, которые я не совсем понимаю,это заголовки, используемые для построения, даже если они несовместимы с библиотеками в ~/.linuxbrew/lib/boost
.
Как я могу убедиться, что каталог include для связанной библиотеки используется только для этой библиотеки?