Связывание динамической библиотеки со статической библиотекой, которая связывается с другими статическими библиотеками
В моем приложении 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 как статические библиотеки.