c++ - 如何调试链接器错误?静态链接 ICU 时出现 undefined reference 错误

标签 c++ static-libraries static-linking 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 并尝试在 clang 和 gcc 下编译 49 和 50。我在 ubuntu x64 系统上。当我在构建静态库后进行检查时,它通过了所有测试。我不知道如何进行。我可以尝试任何想法吗?

最佳答案

如果您正在处理静态库,则可能是链接顺序问题。

尝试以相反的依赖顺序使用 .a 库调用链接器。

关于c++ - 如何调试链接器错误?静态链接 ICU 时出现 undefined reference 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13253017/

相关文章:

c++ - 如何在 C/C++ 中使用带有 OpenSSL 的静态链接

postgresql - Qt 5.5 中 postgresql 插件的静态链接

c++ - 属性组合在 Boost::spirit 中不起作用

c++ - 使用 SWIG 将 C++ 代码与 perl 接口(interface)

objective-c - 归档静态库并获取源代码的可能性?

c++ - 无法调试 C++ 项目,因为无法静态库启动程序 *.lib

c++ - 如何静态编译 boost_iostreams?

c++ - 在继承自 QGraphicsView 的类中使用 QGraphicsSceneMouseEvent

c++ - vector<int> 中的 std::sort 返回 0 而不是值