C++11 未解析的std::uucxx11::基本字符串::~basic\u字符串和std::分配器<;char>;::~分配器()符号

C++11 未解析的std::uucxx11::基本字符串::~basic\u字符串和std::分配器<;char>;::~分配器()符号,c++11,gcc,raspberry-pi,cross-compiling,C++11,Gcc,Raspberry Pi,Cross Compiling,我试图用Qt5.5.1编译到最新的RPI4 Raspbian Buster上,我遇到了无法解释的GLIBCXX未解析符号 什么有效:使用Raspbian Buster上本机编译的qt5.5.1二进制文件,从windows交叉编译到armhf的QtWebApp适用于以下组件 工具链:安装在Windows 10上 Qt二进制库:在RPI4 Raspbian Buster操作系统和 已复制到Windows 10 命令行: c:/SysGCC/raspberry/bin/arm-linux-gnuea

我试图用Qt5.5.1编译到最新的RPI4 Raspbian Buster上,我遇到了无法解释的GLIBCXX未解析符号

什么有效:使用Raspbian Buster上本机编译的qt5.5.1二进制文件,从windows交叉编译到armhf的QtWebApp适用于以下组件

  • 工具链:安装在Windows 10上

  • Qt二进制库:在RPI4 Raspbian Buster操作系统和 已复制到Windows 10

  • 命令行:
    
    c:/SysGCC/raspberry/bin/arm-linux-gnueabihf-g++.exe-std=c++11-fPIC-I。
    {所有QT包括目录}
    -IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include
    -g-rdynamic-funwind表格-Woverflow
    {所有QTWEB源文件}
    -LC:/SysGCC/pi4/pi4qt551/lib
    -lQt5Core-lQt5Gui-lQt5Widgets
    -LQT5多媒体-LQT5多媒体窗口小部件
    -lQt5Network-lm-lpthread-o qtweb
    

  • 这将生成一个在RPI-4上工作良好的arm可执行文件

    什么失败了

    在RPI4上以本机方式编译(这是我想要的开发环境)时,编译异常失败,出现以下错误:

    /usr/bin/ld:/tmp/ccnnsRCD.o:对符号“\u ZNSt7\u cxx1112basic\u stringIcSt11char\u traitssiceed1ev@@GLIBCXX\u 3.4.21”的未定义引用
    

    我试过的(没用)

    1)以下建议来自并通过
    -D\u GLIBCXX\u USE\u cx11\u ABI=0
    失败,出现以下错误:

    /usr/bin/ld:/tmp/ccZfI5co.o:对符号“\u ZNSaIcED1Ev@@GLIBCXX\u 3.4”的未定义引用

    其中,这些符号分别指向
    std::u cxx11::basic\u string::~basic\u string()
    std::allocator::~allocator()

    2)我还运行了所有的组合
    ,有/没有-std=c++11和D_GLIBCXX_USE_cx11_ABI=0
    ,这些都是错误

    WITH  -std=c++11, WITHOUT -D_GLIBCXX_USE_CXX11_ABI=0 
    /usr/bin/ld: /tmp/ccnnsRCD.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21'
    
     WITH -std=c++11, WITH -D_GLIBCXX_USE_CXX11_ABI=0 
    /usr/bin/ld: /tmp/ccZfI5co.o: undefined reference to symbol '_ZNSaIcED1Ev@@GLIBCXX_3.4'
    
     WITHOUT -std=c++11, WITH -D_GLIBCXX_USE_CXX11_ABI=0 
    /usr/bin/ld: /tmp/cctFncwz.o: undefined reference to symbol '_ZNSaIcED1Ev@@GLIBCXX_3.4'
    
     WITHOUT -std=c++11, WITHOUT -D_GLIBCXX_USE_CXX11_ABI=0 
    /usr/bin/ld: /tmp/cchkJYdO.o: undefined reference to symbol '_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21'
    
    3)我还将Win10上安装的sysroot复制到RPi-4,并将其作为其
    --sysroot
    位置传递给
    ~basic_string()
    取消解决错误。(我不知道如何验证
    --sysroot
    是否有任何效果,尽管我检查了
    gcc-v
    输出没有
    ——正如帖子中建议的那样,其中包含了_libs

    信息:除了使用
    gcc
    且未传递
    -IC:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot/opt/vc/include,RPI4 Buster上的命令行完全相同

    问题: 为什么(假设没有明显的编译选项不匹配;)使用gcc 8.3工具链从windows交叉编译到arm linux可以工作,但在raspbian buster上使用gcc 8.3本机编译时,相同的代码库会失败,raspbian buster OS二进制文件中的GLIBCXX版本不匹配

    这件事我已经坚持了两天了。请建议我可以在这里尝试的任何其他步骤。

    • 您是否以
      gcc
      而不是
      g++
      的方式执行编译器?这会导致这个问题。调用
      g++
    • 否则,请尝试将
      -lstdc++
      添加到链接标志中
    说明:


    显然,符号来自C++标准库。在某些情况下,至少当使用GCAR/GCUT/BASIC二进制调用GCC而不是<代码> G++< /COMP> > GCC编译C++代码,但不会自动链接到GNU C++标准库。如果由于某种原因,调用
    g++
    无法解决此问题,您可以尝试添加
    -lstdc++
    标志,这意味着“链接库
    libstdc++。因此
    libstdc++.a
    ,您应该在库搜索路径中找到它”。

    您尝试过从其他类似Unix的系统进行交叉编译吗?您是否尝试过使用gcc 8.3.0在Linux系统上进行本地编译?@einpoklum没有尝试过其他类似于env的unix。Buster是我尝试在本地编译的唯一linux系统。不管怎样,一个完全本机编译怎么会有GLIBCXX冲突,我都很困惑。。。我要么对一些琐碎的事情视而不见,要么就是在新的buster发行版中发现了一个bug。。。想一想,我想我也应该把这个贴在rpi.org上……也许是因为图书馆版本不匹配。您可以安装多个libstdc++吗?另外-您是否尝试添加
    -lstdc++
    ?@einpoklum好的,我将尝试添加
    -lstdc++
    ,并发布结果。(当想知道它是否不是由-STD= C++ 11……暗示)另一件事是举例说明C++库文件中的符号,看看你是否有类似的符号;如果您这样做了,请尝试找出区别。通常,调用
    gcc
    而不是
    g++
    的人会遇到这种情况。事实上,g++在不使用-lstdc++…的情况下解决了这一问题但我确实检查了g++是否像我多次看到的那样链接到了gcc。虽然没有,但arm-linux-gnueabihf-gcc-8 arm-linux-gnueabihf-g++-8在/usr/bin中具有相同的大小和时间戳但是现在运行一个diff报告它们不是完全相同的二进制文件。。。。嗯;)@马格利斯:据此编辑。