代码之家  ›  专栏  ›  技术社区  ›  Dmitrii Vinokurov

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

  •  0
  • Dmitrii Vinokurov  · 技术社区  · 7 年前

    在我的工作场所,我们有一个项目,包含许多需要为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 它使目标应用程序构建良好,但很少会破坏其他应用程序,所以不是这样。我找不到其他修复此错误的方法。

    有人能帮我解决这个问题吗?事先谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dmitrii Vinokurov    7 年前

    解决了的。问题出在不正确的编译器版本中-应用程序是用比应用程序所需的库更新的编译器生成的。用相同的编译器生成-没有其他错误。