Разрешение конкурирующих каталогов в CMake - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть проект на 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 для связанной библиотеки используется только для этой библиотеки?

1 Ответ

0 голосов
/ 17 декабря 2018

Какой заголовочный файл рассматривается, зависит от порядка включаемых каталогов - компилятор обычно рассматривает первый файл, который соответствует указанному имени в любой из включаемых папок.Хотя вы не можете сказать компилятору искать один файл в одном конкретном каталоге, а другой - в другом конкретном каталоге, в некоторой степени вы можете определить порядок включения каталогов.Похоже, что в вашем случае, каталог повышения должен быть проверен раньше другого, поэтому попробуйте ключевое слово BEFORE в вызове target_include_directories , например:

target_include_directories (octopus BEFORE PRIVATE ${Boost_INCLUDE_DIR})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...