У меня есть проект CMake, который включает в себя ссылки на две библиотеки, скажем, A
и B
(на самом деле их больше двух, и одна из них является улучшением, но здесь это не имеет значения).Оба находятся с помощью FindSomething.cmake
сценариев, которые (правильно) заполняют стандартные переменные CMake, такие как включающие каталоги, добавляются через
INCLUDE_DIRECTORIES(${A_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${B_INCLUDE_DIRS})
, а связывание позже выполняется через
TARGET_LINK_LIBRARIES(mytarget ${A_LIBRARIES} ${B_LIBRARIES})
Теперьпроблема в том, что обе библиотеки могут находиться либо в пользовательском расположении, либо в системных каталогах (я, кстати, на linux, CMake 2.8.2) - или в обеих.Допустим, A
только в $HOME/usr/include
и $HOME/usr/lib
, в то время как B
(в моем случае повышение) находится как в системных путях (/usr/include
и /usr/lib
), так и в пользовательских путях - в разных версиях,Сценарии поиска могут быть созданы для поиска либо системы, либо пользовательской библиотеки B
, это работает.
Проблема начинается, когда я хочу установить связь с B
из системных путей. ${B_INCLUDE_DIRS}
и ${B_LIBRARIES}
правильно указывают на общесистемные расположения заголовков и библиотек.Но все еще есть ${A_INCLUDE_DIRS}
, который указывает на несистемный каталог включения, и, в конечном счете, также заголовки для библиотеки B
берутся из этого местоположения, в то время как для связывания B
используется версия из системных путей (через * 1025).*) что приводит к конфликтам, т. е. связывает ошибки.
Изменение порядка операторов INCLUDE_DIRECTORIES
, похоже, ничего не меняет.Я проверил происхождение символов, которые вызывают ошибки связывания через nm --line-numbers
в объектных файлах.
Что я могу сделать?Есть ли хитрость, чтобы
- принудительно упорядочивал каталоги включения (даже если это означало бы отдавать приоритет системному пути, хотя там также указывается местоположение на основе пользователя)?
- указывает CMake использовать
${A_INCLUDE_DIRS}
для всех заголовков от A
и ${B_INCLUDE_DIRS}
для всех заголовков от B
?