Подтвердить что ты не робот

Связывание разделяемых библиотек на основе 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?

4b9b3361

Ответ 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)

Это работало для меня довольно много раз, но я признаю, что могут быть некоторые возможные недостатки, о которых я не знаю (кроме как это похоже на взлома).