在我的工作场所,我们有一个项目,包含许多需要为ARM和x86构建的应用程序。ARM版本与Marvell GCC 4.8.5交叉工具链构建良好。现在我正在开发x86构建(GCC版本4.8.5-4ubuntu8),在一个应用程序中有几个未定义的引用错误。不幸的是,我既不能共享源(可能只是它们的片段),也不能做出显示错误的最小示例,但是我对这个问题做了一些调查,下面是我发现的。
失败的应用程序链接阶段显示以下错误:
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xc0): undefined reference to `non-virtual thunk to <...>::OnBeforeRun()'
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xc8): undefined reference to `non-virtual thunk to <...>::OnRun()'
src/<...>.o:(.data.rel.ro.<...>[<...>]+0xd0): undefined reference to `non-virtual thunk to <...>::OnAfterRun()'
src/<...>.o: In function `<...>::Application(<...>::Runtime&, <...>::SystemFacilityCollection&, <...>::Logger&, char const*, int, char const**)':
<...>/dhcconf.cxx:11: undefined reference to `<...>::Name() const'
src/<...>.o: In function `main':
<...>/main.cxx:21: undefined reference to `<...>::Syslog(std::string const&)'
collect2: error: ld returned 1 exit status
不知道如何处理前导的“非虚拟thunk”错误(这是另一个问题,但现在让我们忽略它们),但关于最后两个错误,我对导致它们的原因知之甚少。
我发现库中包含无法解析的函数和引用(
<...>::Name
从
<...>/dhcconf.cxx:11
和
<...>::Syslog
从
<...>/main.cxx:21
)以及从中列出的符号(当然,这个lib是用
-l
标志):
$ nm --demangle --dynamic --defined-only --extern-only <...>.so | grep Name
0000000000245956 T <...>::Name[abi:cxx11]() const
$ nm --demangle --dynamic --defined-only --extern-only <...>.so | grep Syslog
000000000025e392 T <...>::Syslog(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
此库中还有许多其他符号,其中还包含
[abi:cxx11]
说明符和用法
__cxx11
类型,但似乎目标应用程序不使用它们,我很确定这些与CXx11相关的东西确实会导致错误。
坏掉的应用程序是用
-std=gnu++0x
旗帜。试图建立包含所需符号的库
-D_GLIBCXX_USE_CXX11_ABI=0
它使目标应用程序构建良好,但很少会破坏其他应用程序,所以不是这样。我找不到其他修复此错误的方法。
有人能帮我解决这个问题吗?事先谢谢。