Проблема статического связывания Boost.Filesystem с разделяемой библиотекой - PullRequest
5 голосов
/ 19 июня 2011

Я создаю общую библиотеку с GCC 4.5.2 и Boost 1.46.1 (скомпилировано с --build-type=complete), и это команда из Makefile, которая выполняет часть связывания:

$(CXX) -static -lboost_filesystem -fpic -shared $^ -o $@

Все компилируется нормально, но я получаю следующую ошибку при загрузке приложения:

plugins/crashdetect.so: undefined symbol: _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv

ldd Выходы:

linux-gate.so.1 =>  (0x002f8000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00bf5000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x0032d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00506000)
/lib/ld-linux.so.2 (0x006f6000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00110000)

Я полагаю, это означает, что он статически связан с Boost.

Вот что nm crashdetect.so -u | grep boost говорит:

 U _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv
 U _ZN5boost11filesystem36detail13dir_itr_closeERPvS3_
 U _ZN5boost11filesystem36detail28directory_iterator_constructERNS0_18directory_iteratorERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail28directory_iterator_incrementERNS0_18directory_iteratorEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail6statusERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost6system15system_categoryEv
 U _ZN5boost6system16generic_categoryEv
 U _ZNK5boost11filesystem315directory_entry12m_get_statusEPNS_6system10error_codeE

Так что я думаю, что поскольку этот символ стоит первым в этом списке, то, скорее всего, в этом нет ничего особенного.

Я что-то упустил?

EDIT: Так это невозможно или как?

1 Ответ

3 голосов
/ 22 июня 2011

Я считаю, что:

  1. Ваше использование -static и -shared не является правильным способом.Единственный более или менее надежный способ управления связыванием будет:

    -Wl, -Bstatic -lboost_filesystem -Wl, -Bshared

    в конце командной строки.

  2. Вам не удается установить связь с boost_system.

  3. Ошибка возникает из-за того, что вы на самом деле ссылаетесь на статическую версию boost_filesystem.Однако, поскольку он указан в командной строке перед любыми объектными файлами, из него фактически не извлекается символ, и каждая ссылка на функции boost.filesystem остается неопределенной.И да, компоновщик жалуется на первый неопределенный символ.

...