Как отлаживать ошибки компоновщика? Получение неопределенных ошибок ссылок при статическом связывании ICU

Я построил статические библиотеки для ICU 49 и 50, но при соединении с любым из них я по-прежнему получаю 667 ошибок компоновщика, подобных приведенным ниже. Как я могу подойти к отладке этого и выяснить, в чем проблема? Список поддержки ICU не предложил никакой помощи вообще.

clang++ -ccc-gcc-name g++ -Wl,-E -o velocity main.o city.o auto_lua.o
obj_builder.o index.o obj.o str.o db.o datetime.o msg_parser.o
task_scheduler.o gc.o global_settings.o transaction.o schema.o
skip_node.o util.o thread_context.o hashtable_base.o attr.o
page_pool.o result_buffer.o server_epoll.o logging.o test_server.o
test_main.o     -L../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -lc++
-lllalloc -lluajit -ldl -lm -lrt -lboost_system -lboost_filesystem
-licuuc -licui18n -licudata -lgtest
../lib/libicui18n.a(ucol.ao): In function `uprv_new_collIterate_50':
ucol.cpp:(.text.uprv_new_collIterate_50+0x37): undefined reference to
`icu_50::UMemory::operator new(unsigned long)'
ucol.cpp:(.text.uprv_new_collIterate_50+0xd2): undefined reference to
`icu_50::UMemory::operator delete(void*)'
../lib/libicui18n.a(ucol.ao): In function `uprv_delete_collIterate_50':
ucol.cpp:(.text.uprv_delete_collIterate_50+0x2f): undefined reference
to `icu_50::UMemory::operator delete(void*)'
../lib/libicui18n.a(ucol.ao): In function `initializeFCD(UErrorCode*)':
ucol.cpp:(.text._ZL13initializeFCDP10UErrorCode+0x2c): undefined
reference to `icu_50::Normalizer2Factory::getNFCImpl(UErrorCode&)'
../lib/libicui18n.a(ucol.ao): In function `ucol_initCollator_50':
ucol.cpp:(.text.ucol_initCollator_50+0x126): undefined reference to
`utrie_unserialize_50'
../lib/libicui18n.a(ucol.ao): In function `ucol_prv_getSpecialCE_50':
ucol.cpp:(.text.ucol_prv_getSpecialCE_50+0x9f6): undefined reference
to `u_charDigitValue_50'
ucol.cpp:(.text.ucol_prv_getSpecialCE_50+0xc1f): undefined reference
to `u_charDigitValue_50'

Запустив nm на скомпилированных статических библиотеках, я вижу это:

nm -A libicu* | grep u_charDigitValue_50
libicui18n.a:unum.ao:                 U u_charDigitValue_50
libicui18n.a:decimfmt.ao:                 U u_charDigitValue_50
libicui18n.a:dcfmtsym.ao:                 U u_charDigitValue_50
libicui18n.a:ucol.ao:                 U u_charDigitValue_50
libicui18n.a:regexcmp.ao:                 U u_charDigitValue_50
libicui18n.a:rematch.ao:                 U u_charDigitValue_50
libicui18n.a:uregex.ao:                 U u_charDigitValue_50
libicui18n.a:tzfmt.ao:                 U u_charDigitValue_50
libicuuc.a:uchar.ao:0000000000000000 T u_charDigitValue_50
libicuuc.a:rbbiscan.ao:                 U u_charDigitValue_50

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

Я определил U_STATIC_IMPLEMENTATION = 1 и попытался скомпилировать как 49, так и 50 под clang и gcc. Я в системе Ubuntu x64. Когда я делаю проверку после сборки статических библиотек, она проходит все тесты. Я в растерянности относительно того, как продолжить. Любые идеи, которые я могу попробовать?

3

Решение

Если вы имеете дело со статическими библиотеками, это может быть проблемой порядка ссылок.

Попробуйте вызвать компоновщик с .a libs в обратном порядке зависимости.

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]