Связывание разделяемых библиотек на основе CMake и Order
У меня есть несколько небольших компонентов, которые я создаю как общие библиотеки для моего основного приложения. Давайте используем пример liba
и libb
. Каждый из них встроен в свой собственный подкаталог следующим образом:
add_library(liba SHARED a.cpp)
Затем в корневой папке проекта мне нужно привязать мое основное приложение к обоим.
include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
CMake отлично работает с этим, и мое приложение компилируется, но не связывается. Проблема в том, что b ссылается на a. Если я поставлю порядок библиотек при компоновке как
target_link_libraries(dummy b a)
Программа компилирует и связывает только тонкие
Когда такая система запускает более сложную взаимосвязанную зависимость библиотек, она становится невозможной, даже если зависимости ацикличны. Как я могу управлять этапом ссылки здесь? Есть ли уловка для заказа библиотек для компоновки в CMake?
Ответы
Ответ 1
Вы можете указать связь между a
и b
, добавив
target_link_libraries(b a)
Из docs:
По умолчанию зависимость библиотек транзитивна. Когда эта цель связана с другой целью, библиотеки, связанные с этой целью, также появятся на линии ссылок для другой цели.
Итак, если вы укажете a
как зависимость от b
таким образом, вам даже не нужно явно перечислять a
в любой цели, которая зависит от b
, то есть ваша другая команда может быть просто:
target_link_libraries(dummy b)
хотя это не повредило бы списку a
.
Ответ 2
Простое решение (особенно для круговых зависимостей) может состоять в том, чтобы просто поместить все ваши библиотеки в переменную списка, а затем добавить этот список дважды (или, если необходимо,), например:
set(LINK_LIBS "liba libb libc")
target_link_libraries(app ${LINK_LIBS} ${LINK_LIBS})
(или просто введите список дважды друг за другом в функции target_link_libraries
)
Это работало для меня довольно много раз, но я признаю, что могут быть некоторые возможные недостатки, о которых я не знаю (кроме как это похоже на взлома).