当使用g++-arm-linux-gnueabi时,包含C++系统头的正确方式
Proper way to include C++ system headers when using g++-arm-linux-gnueabi?
我正试图在安装了gcc-arm-linux-gnueabi
和g++-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
- C++,系统无法执行指定的程序
- clang++ 是否以更轻松的方式处理系统标头?
- 是否可以在C 中以编程方式查询不同的DNS名称服务器,从而忽略系统设置
- 以线性最小二乘方式求解系统 Ax=b,具有复元素和下三角形平方 A 矩阵
- 哪种方式将 HHOOK 消息返回到系统更好
- 如何在不挂载设备的情况下以编程方式发现文件系统(如"fdisk -l")
- 系统范围的热键快捷方式(Windows/Qt):防止窗口锁定
- 我需要以相反的方式复制一个长整型数组,我需要系统函数,例如 memcpy 有没有
- Qt生成按键(键盘)到系统(OS)的跨平台方式
- 做系统();命令的工作方式与批处理命令完全相同
- 如何使系统进入睡眠状态并再次自动(以编程方式)从睡眠状态恢复,而无需任何手动"鼠标单击或键盘点击"
- 当使用g++-arm-linux-gnueabi时,包含C++系统头的正确方式
- Apache Qpid/Redhat MRG-以可移植的方式跨不同系统发送日期
- 当路径中存在同名文件时,以跨平台方式包含系统头文件
- 如何使用C/C++以编程方式检查窗口中的系统文件夹
- 如何以跨平台的方式获得(几乎)唯一的系统标识符
- 以编程方式打开系统信息
- 安卓系统中的科学和数值模拟是哪种方式?ndk
- C / C++系统可移植方式更改最大打开文件数
- 如何以编程方式使系统崩溃