当使用g++-arm-linux-gnueabi时,包含C++系统头的正确方式

Proper way to include C++ system headers when using g++-arm-linux-gnueabi?

本文关键字:系统 方式 C++ 包含 g++-arm-linux-gnueabi      更新时间:2023-10-16

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

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

/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

我已经在其他平台(如Android、iOS和Windows Phone)上交叉编译了库,所以我很清楚需要做什么。然而,这是我第一次使用arm-linux-gnueabi

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

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


EDIT:以下是-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-gneabi无法使用--sysroot编译C++程序。

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-gneabi无法使用--sysroot编译C++程序。

为了解决这个错误,应该使用-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