使用 g++-arm-linux-gnueabi 时包含 C++ 系统头文件的正确方法?

Posted

技术标签:

【中文标题】使用 g++-arm-linux-gnueabi 时包含 C++ 系统头文件的正确方法?【英文标题】:Proper way to include C++ system headers when using g++-arm-linux-gnueabi? 【发布时间】:2014-09-28 20:54:49 【问题描述】:

我正在尝试在 Ubuntu 14.04 上编译一个安装了包 gcc-arm-linux-gnueabig++-arm-linux-gnueabi 的库。

遇到的第一个源文件编译失败:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -I. -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp
In file included from cryptlib.h:83:0,
                 from seckey.h:8,
                 from 3way.h:7,
                 from 3way.cpp:5:
stdcpp.h:14:18: fatal error: memory: No such file or directory
compilation terminated.

当我执行find 时,我看到 C++ 标头位于:

$ find /usr -name memory
/usr/arm-linux-gnueabi/include/c++/4.7.3/tr1/memory
/usr/arm-linux-gnueabi/include/c++/4.7.3/memory
/usr/arm-linux-gnueabi/include/c++/4.7.3/ext/memory
...

/usr/arm-linux-gnueabi 已作为SYSROOT 提供:

$ ls /usr/arm-linux-gnueabi
bin  include  lib

添加isysroot 没有帮助:

/usr/bin/arm-linux-gnueabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
-mcpu=cortex-m3 -mthumb -isysroot=/usr/arm-linux-gnueabi/include/c++/4.7.3
--sysroot=/usr/arm-linux-gnueabi -c 3way.cpp
In file included from cryptlib.h:83:0,
                 from seckey.h:8,
                 from 3way.h:7,
                 from 3way.cpp:5:
stdcpp.h:14:18: fatal error: memory: No such file or directory

我已经在其他平台(如 androidios 和 Windows Phone)上交叉编译了该库,因此我很清楚需要做什么。不过,这是我第一次使用arm-linux-gnueabi

在使用 g++-arm-linux-gnueabi 包时包含 C++ 头文件和库的正确方法是什么?

相关:spec 文件不应该已经处理了吗?


编辑:这里有一些与-v 相关的信息。这些内置路径看起来不健康。看起来工具链正在尝试形成 C++ 标头的路径,但它做得不好:

/usr/bin/arm-linux-gnueabi-g++ -v -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM 
-mcpu=cortex-m3 -mthumb --sysroot=/usr/arm-linux-gnueabi -c 3way.cpp

...
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi)
...

编辑:这看起来像是工具链使用的内部路径中的错误。在内置路径中,请注意路径中有一个额外的/usr/arm-linux-gnueabi。下面的答案提供了一种解决方法。

向 Ubuntu 提交的错误报告:g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot。

【问题讨论】:

你的目标CPU是什么你用的是linux编译器,但是-mcpu=cortex-m3,不太可能运行Linux,至少不是全功能版本。查看Buildroot 并将其配置为正确的目标。 @yegorich - 谢谢(我忘了 uclib 和 buildroot)。这是目前的测试,所以我可以选择任何 CPU 进行测试。这是一个测试,因为我关注的是程序,而不是 CPU。你会为 arm-linux-gnueabi 推荐什么 CPU? 尝试使用 --sysroot /usr 而不是 --sysroot=/usr ?您在路径中有等号,这绝对不应该...... 谢谢@Ben。 - 省略等号时没有乐趣。问题依然存在。我快速浏览了GCC man 页面,它显示了等号。不过,我更新了错误报告以防万一。 【参考方案1】:
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi/sf"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/arm-linux-gnueabi/include/c++/4.7.3/backward"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/local/include/arm-linux-gnueabi"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include/arm-linux-gnueabi"
ignoring nonexistent directory "=/usr/arm-linux-gnueabi/include/c++/4.7.3/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/include-fixed
 /usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.7.3-12ubuntu1) version 4.7.3 (arm-linux-gnueabi)
...

这看起来像是工具链使用的内部路径中的一个错误。在内置路径中,请注意路径中有一个额外的/usr/arm-linux-gnueabi。向 Ubuntu 提交的错误报告:g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot。

要解决此错误,应使用 -I 显式添加 C++ 标头的路径:

/usr/arm-linux-gnueabi/include/c++/4.7.3 /usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi

--sysroot 链接时无需指定 C 和 C++ 库,因为该选项可以正确处理它们。

所以编译/链接命令看起来类似于:

/usr/bin/arm-linux-gnueabi-g++ ... -mcpu=cortex-m3 -mthumb \
  -I/usr/arm-linux-gnueabi/include/c++/4.7.3 \
  -I/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi \
  --sysroot=/usr/arm-linux-gnueabi test.cpp -o test.exe

【讨论】:

以上是关于使用 g++-arm-linux-gnueabi 时包含 C++ 系统头文件的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

linux 下安装arm-linux-gnueabi交叉编译器

无法让 Buildozer 在 ubuntu 中工作 - “致命错误:arm-linux-gnueabi/python2.7/pyconfig.h:没有这样的文件或目录”

arm-linux-gnueabi和arm-linux-gnueabihf 的区别

Linux coredump 回溯丢失帧

如何在 petalinux 中检查共享库依赖项

如何在 Cython 中使用不同的 C++ 编译器?