使用GCC 4.8.5构建的应用程序中对cxx11函数的未定义引用

时间:2018-09-18 07:01:56

标签: c++ linux c++11 gcc linker

在我的工作场所,我们有一个项目,其中包含许多需要针对ARM和x86进行构建的应用程序。 Marvell GCC 4.8.5跨工具链可很好地构建ARM版本。现在,我正在使用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

不知道如何处理导致“非虚拟重击”的错误(这是另一个问题,但是现在让我们忽略它们),但是关于最后两个错误,我几乎没有提示它们的成因。 / p>

我找到了包含函数,无法解析的引用(来自<...>::Name的{​​<...>/dhcconf.cxx:11和来自<...>::Syslog的{​​{1}})的库,并列出了其中的符号(当然可以使用<...>/main.cxx:21标志正确指定此库):

-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的包含所需符号的内置库,它可以使目标应用构建良好,但破坏了其他一些应用,因此并非如此。我找不到其他解决此错误的方法。

请问有人可以帮助我解决这个问题吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

已解决。问题出在不正确的编译器版本上-应用程序是使用比库要求新的编译器构建的。使用相同的编译器构建-没有更多错误。