Как да отстранявате грешки при свързване? Получаване на недефинирани референтни грешки при статично свързване на ICU

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

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. Когато правя проверка след изграждане на статичните библиотеки, тя преминава всички тестове. Не знам как да продължа. Някакви идеи, които мога да опитам?


person Eloff    schedule 06.11.2012    source източник


Отговори (1)


Ако имате работа със статични библиотеки, това може да е проблем с реда на връзките.

Опитайте да извикате линкера с .a libs в обратен ред на зависимост.

person onitake    schedule 06.11.2012
comment
Прав си, въпреки че се кълна, че изпробвах реда: -licui18n -licuuc -licudata, правейки това сега работи (търсих в Google какъв ред е използван при свързване.) Идвайки от Windows, не знаех, че редът има значение (не е с msvc.) Благодаря ви много! - person Eloff; 06.11.2012
comment
При споделените библиотеки не е така. Но със статични библиотеки, линкерът може да бъде много придирчив. Може също да помогне да стартирате ranlib на .a, за да създадете таблица с индекс на символи, която по-късно се използва от линкера. - person onitake; 08.11.2012
comment
Отговорът е съвсем правилен. Обърнете внимание, че започнахме да коригираме нашите проби, за да ги свързваме в правилния ред за статични компилации, така че се надяваме, че ще има по-малко подвеждащи линии за връзки. - person Steven R. Loomis; 13.11.2012
comment
Това важи и за cmake. Редът на свързаните статични библиотеки има значение в cmake файловете. - person Akdeniz; 03.11.2015