使用g ++时包含C++系统头文件的正确方法 - arm-linux-gnueabi?
我试图在Ubuntu 14.04上安装包gcc-arm-linux-gnueabi
和g++-arm-linux-gnueabi
来编译库。使用g ++时包含C++系统头文件的正确方法 - 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
我跨编译在其他平台上的库(如Android,iOS和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。
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
。 Bug提交给Ubuntu:g++-arm-linux-gnueabi cannot compile a C++ program with --sysroot。
要解决的bug,到C的路径++头应明确与-I
补充说:
/usr/arm-linux-gnueabi/include/c++/4.7.3
/usr/arm-linux-gnueabi/include/c++/4.7.3/arm-linux-gnueabi
没有必要指定C和C++库当与--sysroot
链接时,因为该选项正确处理它们。
所以编译/链接命令将类似于:
/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
什么是你的目标CPU您使用的Linux编译器,但-mcpu = Cortex-M3的,这是不太可能在运行Linux至少不是全功能的版本。看看[Buildroot](http://buildroot.uclibc.org/)并将其配置为适当的目标。 – yegorich 2014-09-28 21:06:28
@yegorich - 谢谢(我忘了uclib和buildroot)。这是目前的测试,所以我可以选择任何CPU进行测试。它是一个测试,因为我专注于程序,而不是CPU。你会为'arm-linux-gnueabi'提出什么样的CPU? – jww 2014-09-28 21:15:36
用'--sysroot/usr'而不是'--sysroot =/usr'试试?你在路径中有相同的标志,那绝对不应该是...... – 2014-09-29 00:37:39