c – 如何调试链接器错误?静态链接ICU时获取未定义的引用错误
发布时间:2020-12-16 10:32:22 所属栏目:百科 来源:网络整理
导读:我已经为ICU 49和50构建了静态库,但是当与其中任何一个链接时,我仍然会得到667个链接器错误,如下所示.我该如何处理调试并找出问题所在? ICU支持名单根本没有提供任何帮助. clang++ -ccc-gcc-name g++ -Wl,-E -o velocity main.o city.o auto_lua.oobj_build
我已经为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,我尝试在clang和gcc下编译49和50.我在ubuntu x64系统上.当我在构建静态库之后进行检查时,它会通过所有测试.我不知道如何继续.我可以尝试任何想法吗? 解决方法
如果您正在处理静态库,则可能是链接顺序问题.
尝试以相反的依赖顺序使用.a libs调用链接器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |