Связывание динамической библиотеки со статической библиотекой, которая связывается с другими статическими библиотеками

В моем приложении C++ у меня есть статическая библиотека (libCOMMON.a), которая связывает библиотеки повышения: system, filsystem, timer и chrono.

Я использую CMake и вот как я создаю и связываю libCOMMON.a:

ADD_LIBRARY(COMMON ${COMMON_SRCS})
target_link_libraries(COMMON 
    ${BOOST_LIB_DIR}/libboost_filesystem.a
    ${BOOST_LIB_DIR}/libboost_system.a
    ${BOOST_LIB_DIR}/libboost_timer.a
    ${BOOST_LIB_DIR}/libboost_chrono.a
)

У меня также есть плагины для этого приложения, которые ссылаются на libCOMMON.a. Плагины построены как динамические библиотеки. Все компилируется нормально (с использованием gcc), но когда я запускаю приложение, плагины не могут быть загружены, потому что некоторые символы в динамических библиотеках, связанных с boost, не могут быть разрешены.

Решение состояло в том, чтобы связать каждый из плагинов для повышения. Есть ли способ лучше? Я подумал, что если библиотеки boost будут статически связаны с libCOMMON.a, этого будет достаточно, чтобы связать плагины с libCOMMON.a.

Может кто-нибудь объяснить, что происходит?

Спасибо

1 ответ

Решение

Я думаю, проблема в том, что библиотеки boost по умолчанию создаются как динамические библиотеки. Даже если ".a" предполагает, что они созданы как статические библиотеки, папка lib в boost содержит библиотеку ".so" с каждым ".a". Это означает, что libCOMMON.a динамически связан для повышения библиотек. По этой причине плагины, которые статически ссылаются на libCOMMON.a, также должны динамически связываться с библиотеками повышения. Лучшим решением было бы создать библиотеки boost как статические библиотеки.

Другие вопросы по тегам