【问题标题】:Linking 'libstdc++' library is broken in embedded linux在嵌入式 linux 中链接“libstdc++”库被破坏
【发布时间】:2014-01-14 11:45:53
【问题描述】:

我一直在做一个项目,该项目将加载到嵌入式系统上,没有足够的内存/磁盘空间来安装 C++ 编译器和本地编译代码。

因此,我需要在我的开发(主机)机器上“交叉编译”代码,以便在目标机器(嵌入式 Linux)上使用。

与使用字符串和 iostreams 相关的问题,这是 C++ 标准模板库 (STL) 的一个特性。然而,由于内存在嵌入式系统中非常重要,标准模板库 (libstdc++) 无法在目标端使用。

我需要在主机上统计链接标准库,而不是在目标端动态链接。因此,在我的 Makefile 中,我需要在编译和链接步骤中进行稍微复杂的修改才能构建我的项目。

我在链接步骤中使用了一些参数,例如 -nodefaultlibs、-static-libstdc++ 和 -lstdc++,并且还在编译器标志中添加了 -nostdinc++。仍然存在目标方面的问题; “无法加载库 libstdc++.so.6”

我尝试过的大多数设置都不起作用。有什么解决办法吗?

【问题讨论】:

  • 我认为您在尝试静态链接之前还为您的目标架构交叉编译了 libstdc++?
  • 实际上,我打算交叉编译主机中的代码,而不为目标架构交叉编译任何标准 c++ 库(如 libstdc++ 库)。在主机中,我试图在目标端运行时链接统计的 c++ 标准库。

标签: c++ c cross-compiling


【解决方案1】:

-lstdc++ 覆盖 -static-libstdc++,尝试仅与 -static-libstdc++ 链接。

例如看这个:

$ g++ -o foo foo.cpp -static-libstdc++ -lstdc++
$ ldd foo
    linux-gate.so.1 =>  (0x0056b000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x007ae000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x005dd000)
    /lib/ld-linux.so.2 (0x002bc000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0095e000)

libstdc++ 是动态链接的!

$ g++ -o foo foo.cpp -static-libstdc++
$ ldd foo
    linux-gate.so.1 =>  (0x0097b000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x001f9000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x0037f000)
    /lib/ld-linux.so.2 (0x00199000)

现在不是了。

【讨论】:

  • 非常感谢您的详尽解释。我最初的想法是避免在目标端安装标准 c++ 库,例如 libstdc++,方法是在主机中静态链接它们(因为目标端嵌入式 linux 的限制)。你的回答完全正确。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2014-05-15
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多