Я создаю разделяемую библиотеку, которая статически связана с надстройкой, как показано ниже:
/usr/bin/c++ -fPIC -Wall -Wshadow -g -Wl,-Bstatic -lboost_date_time -lboost_thread -lboost_filesystem -lboost_system -Wl,-Bdynamic -ldl -shared -Wl,-soname,liboms_rocketmq.so -o ../lib/liboms_rocketmq.so
Проблема заключается в том, что при открытии этой библиотеки в Ubuntu 16.04 символы, которые должны были быть статически связаны, не определены (см. Следующий вывод команды: U), поскольку символ можно найти в текстовой области libboost_system.so, как проверено в последнем выводе команды ,
Например:
nm ../liboms_rocketmq.so | grep _ZN5boost6system16generic_categoryEv
U _ZN5boost6system16generic_categoryEv
nm /usr/local/lib/libboost_system.so | grep _ZN5boost6system16generic_categoryEv
00000000000013e0 T _ZN5boost6system16generic_categoryEv
Любая идея, почему статическое связывание не работает, как ожидалось? ака, вставив символ в текстовую область нашей общей библиотеки.
Выяснил проблему: нам нужно поместить эти зависимые статические библиотеки в конце (после нашего собственного кода) как раз перед -pthreads, который должен быть последним флагом ссылки.
Других решений пока нет …