为什么 g++ 找不到已安装的系统包含
Why would g++ be unable to find system includes which are installed?
这是一个在我的桌面Linux机器(Ubuntu 14.04 64位英特尔,fwiw)上编译的简单示例程序:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
cout<<"hello"<<endl;
return 0;
}
当我尝试在嵌入式机器上编译它时,该机器似乎安装了头文件(相当于构建基本文件):
me@t4240rdb:~$ ls /usr/include/c++/4.9.2/iostream
/usr/include/c++/4.9.2/iostream
me@t4240rdb:~# find /usr/include/ -name cmath
/usr/include/c++/4.9.2/ext/cmath
/usr/include/c++/4.9.2/cmath
/usr/include/c++/4.9.2/tr1/cmath
使用g++ /home/me/tc.cpp
,我得到
/home/me/tc.cpp:1:20: fatal error: iostream: No such file or directory
#include <iostream>
^
compilation terminated.
有人知道为什么会发生这种情况吗?
包括注释中要求的 g++ -v 的输出:
me@t4240rdb:~# g++ -v /home/me/tc.cpp
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib64/gcc/gcc/powerpc64-fsl-linux/4.9.2/lto-wrapper
Target: powerpc64-fsl-linux
Configured with: /home/jenkins/ci/iso-make/master/b4860qds-64b/build_b4860qds-64b/tmp/work-shared/gcc-4.9.2-r0/gcc-4.9.2/configure --build=x86_64-linux --host=powerpc64-fsl-linux --target=powerpc64-fsl-linux --prefix=/usr --exec_prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib64/gcc --datadir=/usr/share --sysconfdir=/etc --sharedstatedir=/com --localstatedir=/var --libdir=/usr/lib64 --includedir=/usr/include --oldincludedir=/usr/include --infodir=/usr/share/info --mandir=/usr/share/man --disable-silent-rules --disable-dependency-tracking --with-libtool-sysroot=/home/jenkins/ci/iso-make/master/b4860qds-64b/build_b4860qds-64b/tmp/sysroots/b4860qds-64b --with-gnu-ld --enable-shared --enable-languages=c,c++ --enable-threads=posix --enable-multilib --enable-c99 --enable-long-long --enable-symvers=gnu --enable-libstdcxx-pch --program-prefix=powerpc64-fsl-linux- --without-local-prefix --enable-target-optspace --enable-lto --enable-libssp --disable-bootstrap --disable-libmudflap --with-system-zlib --with-linker-hash-style=gnu --enable-linker-build-id --with-ppl=no --enable-checking=release --enable-cheaders=c_global --with-sysroot=/ --with-build-sysroot=/home/jenkins/ci/iso-make/master/b4860qds-64b/build_b4860qds-64b/tmp/sysroots/b4860qds-64b --with-native-system-header-dir=/home/jenkins/ci/iso-make/master/b4860qds-64b/build_b4860qds-64b/tmp/sysroots/b4860qds-64b/usr/include --with-gxx-include-dir=/usr/include/c++/4.9.2 --with-long-double-128 --enable-nls --enable-__cxa_atexit
Thread model: posix
gcc version 4.9.2 (GCC)
COLLECT_GCC_OPTIONS='-v' '-shared-libgcc'
/usr/lib64/gcc/gcc/powerpc64-fsl-linux/4.9.2/cc1plus -quiet -v -D_GNU_SOURCE -D__unix__ -D__gnu_linux__ -D__linux__ -Dunix -D__unix -Dlinux -D__linux -Asystem=linux -Asystem=unix -Asystem=posix /home/me/tc.cpp -quiet -dumpbase tc.cpp -auxbase tc -version -o /tmp/cc4avGfH.s
GNU C++ (GCC) version 4.9.2 (powerpc64-fsl-linux)
compiled by GNU C version 4.9.2, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "usr/include/c++/4.9.2"
ignoring nonexistent directory "usr/include/c++/4.9.2/powerpc64-fsl-linux"
ignoring nonexistent directory "usr/include/c++/4.9.2/backward"
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/lib64/gcc/powerpc64-fsl-linux/4.9.2/../../../../powerpc64-fsl-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib64/gcc/powerpc64-fsl-linux/4.9.2/include
/usr/lib64/gcc/powerpc64-fsl-linux/4.9.2/include-fixed
/usr/include
End of search list.
GNU C++ (GCC) version 4.9.2 (powerpc64-fsl-linux)
compiled by GNU C version 4.9.2, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.2
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 63db6eac369c397424f29967693724f9
/home/me/tc.cpp:1:20: fatal error: iostream: No such file or directory
#include <iostream>
^
compilation terminated.
这很有趣 - 配置显然有问题。 我该如何解决?
所以这被证明是 gcc 中的一个错误,其中将 sysroot 设置为"/"进行配置正是导致此问题的原因。 它是在 gcc 4.7.2 中发现的,在 gcc 4.9.2 中仍然被破坏。 我有一个修复问题的补丁,并继续尝试了解如何让 bitbake 使用该补丁重建目标 gcc,所以我将回答这个问题。
这是关于错误和补丁的电子邮件:https://gcc.gnu.org/ml/gcc-patches/2012-02/msg00320.html
相关文章:
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- 如何在不包含完整的文件系统头的情况下使用文件系统的类路径C++17?
- 如何为代码包含负值?号码系统转换
- ctime 包含 boost::文件系统时出错
- clang++通过自制程序(llvm38)-包含系统的编译错误
- libclang:添加编译器系统包含路径(Windows中的Python)
- [cmake]如何使用cmake在windows上包含和链接系统库
- Visual studio 2012中针对包含系统变量的IntelliSense问题
- QMake 安装头文件(复制到系统的包含目录)
- 为什么 g++ 找不到已安装的系统包含
- Clang 使用了错误的系统包含目录
- Python clang不搜索系统包含的路径
- boost文件系统3路径包含检查
- 当使用g++-arm-linux-gnueabi时,包含C++系统头的正确方式
- 当路径中存在同名文件时,以跨平台方式包含系统头文件
- 如何在不将glew32.dll放入系统根目录的情况下包含它
- 本地包含路径隐藏系统头文件
- 如何配置teamcity构建代理以在系统上使用包含文件
- CMake:包含目录的排序(如何混合基于系统和用户的包含路径?)
- 64位系统能运行包含内联汇编的32位软件吗?