在Ubuntu中交叉编译32位的64位程序时,缺少包含"bits/c ++ config.h"

Jes*_*ogt 166 ubuntu g++ cross-compiling 32bit-64bit ubuntu-10.10

我正在运行32位版本的Ubuntu 10.10并尝试交叉编译为64位目标.根据我的研究,我已经安装了g ++ - multilib包.

该程序是一个非常简单的hello世界:

#include <iostream>

int main( int argc, char** argv )
{
  std::cout << "hello world" << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -m64 main.cpp
Run Code Online (Sandbox Code Playgroud)

错误:

In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

我发现了一个c++config.h文件,但他们居住下i486-linux-gnui686-linux-gnu目录中/usr/include/c++/4.4/没有c++config.h/usr/include/c++/bits.

关于我失踪的任何想法?没有-m64标志的编译工作正常(创建并正确运行a.out).

编辑感谢来自@nightcracker的提示,我对32位和64位系统上的包含结构进行了一些调查.我在下面添加了一个答案,暂时"修复"了问题,但我认为它会在下次更新时中断.基本上,我错过了一个名为的目录/usr/include/c++/4.4/i686-linux-gnu/64,该目录应包含一个名为bits具有缺失包含文件的子目录.知道什么包应该照顾这个吗?

Ant*_*ile 284

添加此答案部分是因为它解决了我的同一问题的问题,因此我可以自己为此问题添加书签.

我能够通过执行以下操作来修复它:

sudo apt-get install gcc-multilib g++-multilib
Run Code Online (Sandbox Code Playgroud)

如果您安装了默认情况下未发布的gcc/ 的版本g++(例如g++-4.8在lucid上),您也希望与版本匹配:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib
Run Code Online (Sandbox Code Playgroud)

  • 感谢指针,但是`sudo apt-get install gcc-multilib g ++ - multilib`似乎更好(它会自动解析为你的gcc版本). (40认同)
  • 确保匹配系统上安装的`gcc和g ++`的版本.在Ubuntu 14.04上我安装了`gcc-4.8`和`g ++ - 4.8`,所以我安装了`gcc-4.8-multilib`和`g ++ - 4.8-multilib`. (30认同)
  • 这在64位计算机上使用-m32进行编译时解决了我的问题.谢谢 (3认同)

orl*_*rlp 10

你尝试添加-I/usr/include/c++/4.4/i486-linux-gnu-I/usr/include/c++/4.4/i686-linux-gnu

  • 对不起,我不知道,我只是提出了一个快速的hacky工作解决方案:) (2认同)

小智 5

在RHEL 6.2(x86_64)中编译时,我安装了32位和64位libstdc ++ - dev软件包,但我有"c ++ config.h没有这样的文件或目录 "问题.

解析度:

目录/usr/include/c++/4.4.6/x86_64-redhat-linux丢失了.

我做了以下事情:

cd /usr/include/c++/4.4.6/
mkdir x86_64-redhat-linux
cd x86_64-redhat-linux
ln -s ../i686-redhat-linux 32
Run Code Online (Sandbox Code Playgroud)

我现在能够在64位操作系统上编译32位二进制文​​件.