【问题标题】:How to cross compile GCC on x86 for Sun4v?如何在 x86 上为 Sun4v 交叉编译 GCC?
【发布时间】:2016-03-14 11:32:01
【问题描述】:

我正在使用 C++ 编写编程作业。本课程的讲师要求所有代码都在 UNIX 服务器上编译和运行。服务器是 SunOS 机器。我使用 GCC 5.2 在我的个人笔记本电脑上编写了所有代码,它支持大多数 C++11 功能。但是,当我将代码上传到服务器并尝试编译时,我惊讶地发现服务器上的g++版本是4.2.1,它是2007年年中发布的。不支持许多 C++11 功能。甚至不接受 -std 参数。

我尝试下载最新的GCC的源代码并在服务器上编译。不幸的是,每个帐户的磁盘配额限制为 500M。我只是想知道是否可以在我的 x86 机器上交叉编译 GCC 并将二进制文件上传到服务器上,以便我可以编译我的 C++ 代码。

顺便说一句,我已经联系了 IT 部门更新软件,但他们回答说他们近期没有这样的计划。

我确实在 Internet 上对交叉编译进行了研究,并找到了一些教程。但他们并不容易跟随。除了二进制文件之外,还有很多依赖项,例如头文件和库。所以在我放弃并修改我的代码以适应旧的编译器之前,有人可以给我一些建议吗?

谢谢。

uname -a 返回以下结果

SunOS 5.10 Generic_147147-26 sun4v sparc SUNW,T5240

【问题讨论】:

  • 是否可以上传您的代码并在 UNIX 服务器上进行本地编译?
  • 请先询问您的导师您是否可以使用 C++11 进行编码。也许他(悲哀地)希望你学习 C++98...
  • 如果您以前从未这样做过,您可能会花费几天的时间来交叉编译 GCC。值得痛苦吗?将您的作业移植到 C++98 可能(可悲地)更容易做到。如果你确实交叉编译了 GCC,你需要上传的不仅仅是二进制文件......

标签: c++11 gcc


【解决方案1】:

当然有可能,而且是writing operating systems时你通常做事的方式。

首先,you need to take binutils in the toolbox 也是。一旦你拥有了所有的神圣源泉,让我们准备吧!

export PREFIX="$HOME/opt" # All the stuff will get installed here!
export TARGET=sparc-sun-solaris  # I'm not *100%* sure if this is correct, check it yourself
export PATH="$PREFIX/bin:$PATH"  # If you forget this/close the terminal, you're doomed!

现在,让我们和小怪物相处吧……应该构建 binutils 吧!

cd $HOME/src # Or where you have the sources
mkdir binutils-build
cd binutils-build
../binutils-src/configure --target=$TARGET --prefix="$PREFIX" --disable-nls
make
make install

--disable-nls 禁用对本地自然语言的支持(又名:编译器以您自己的语言打印错误!),并且只使用英语作为消息。这不是必须的,但它肯定会加快构建 binutils 的过程。

现在,编译 GCC 本身是一个非常脆弱的过程,它可能在任何地方失败,无论如何,所以要做好准备!这个过程很长(在某些机器上可能需要长达一个小时),但相信我,LLVM+Clang 更糟;)。

cd $HOME/src
cd gcc-src
./contrib/download_prerequisites # Get GMP, MPFR, and MPC
cd ..
mkdir gcc-build
cd gcc-build
../gcc-src/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc

如果你在编译时没有遇到问题(相信我,你除非你对这个世界太幸运了),你会有一个在你的机器上运行的工具链,但是为 SunOS/SPARC 编译!顺便说一句,--enable-languages=c,c++ 意味着 GCC 将支持编译 C 和 C++ 代码。不多不少,不多不少。试试看...

sparc-sun-solaris-g++ --version

现在,如果您想获得一个在服务器上运行的服务器编译器,您将不得不使用双 canadian cross。基本上,你要做的就是……

export PREFIX="$HOME/some-holy-directory" # This path *must* be the same for both your machine and the target server!
export HOST=$TARGET

然后再次重复编译过程,记住将选项--host=$HOST 添加到两个configure 脚本!完成后,您必须将some-holy-directory 恰好 的相同位置移动到服务器中。如果它不适合 500MB,那么,请询问您的老师您是否至少可以在自己的机器上编译作业,然后将它们上传到服务器。否则,您将被 C++98 排除在外。

顺便说一句:请注意,交叉编译 GCC 本身是一个更加脆弱的过程。所有这篇文章都只是理论上的,因为我不会为了这样做而做所有这些步骤。如果您有任何重大问题,或者如果有人在步骤中发现错误,请发表评论;)。

编辑:显然,您还必须构建 Glibc 和所有时髦的东西......

我希望这对你有所启发!

【讨论】:

  • 嗯,这是一次不错的尝试;不知道谁投了反对票!
  • @Am_I_Helpful:我只是想知道这是否对 OP 有帮助......当然,不评论他们为什么投反对票的反对票对这个社区来说是一种耻辱。如果投反对票的人看到了这一点,他/她可以说明他/她认为这个答案是错误的/没有用的吗?
  • 我喜欢你的回答,但我没有足够的声誉来支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多