2015-11-12 37 views
4

我在写一个使用C++的编程任务。本课程的讲师需要编译所有代码并在UNIX服务器上运行。该服务器是SunOS机器。我用我的个人笔记本电脑上的所有代码写了GCC 5.2,它支持大多数C++ 11功能。但是,当我将代码上传到服务器并尝试编译它时,我惊奇地发现服务器上的g ++版本是4.2.1,它在2007年中期发布。许多C++ 11功能不受支持。即使-std参数也不被接受。如何在x86上为Sun4v交叉编译GCC?

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

顺便说一句,我已经联系了IT部门关于更新软件,但他们回应说他们在不久的将来没有这样的计划。

我在互联网上做了关于交叉编译的研究,并找到了一些教程。但他们不容易遵循。除了二进制文件之外,还有很多依赖项,比如头文件和库。所以,在我放弃并修改我的代码以适应旧的编译器之前,任何人都可以给我一些建议吗?

谢谢。

uname -a返回以下结果

SunOS 5.10 Generic_147147-26 sun4v sparc SUNW,T5240 
+0

是否可以上传代码并在UNIX服务器上本地编译? –

+0

先问你的导师,如果你可以在C++ 11中编码。也许他(可惜)希望你学习C++ 98 ... –

+0

如果你以前从未这样做过,你可能会花费数天的时间来交叉编译GCC。这是值得的痛苦?可能将您的任务移植到C++ 98可能(可悲)更容易。如果你确实交叉编译GCC,你需要上传的不仅仅是二进制文件... –

回答

3

当然,这是可能的,这是你平时做的事情时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禁用本地自然语言支持(a.k.a:在您自己的语言编译器打印错误),并且只使用英语的消息。这不是必须的,但它肯定会加速构建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! BTW,--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=$HOSTconfigure脚本!完成后,您必须将some-holy-directory正好相同的位置移入服务器。如果它不适合500MB,那么问问你的老师,你是否至少可以在自己的机器上编译作业,然后将它们上传到服务器。否则,你会被忽略掉C++ 98。

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

编辑:显然,你必须编译Glibc和所有的时髦的东西太...

我希望这使得一些光你!

+0

嗯,这是一个不错的尝试;不知道谁降低了这个! –

+1

@Am_I_Helpful:我只想知道这是否对OP有帮助...当然,downvoters谁不评论他们为什么downvoted是这个社区的耻辱。如果downvoter看到这一点,他/她是否可以说明他/她认为哪个错误/没有用于这个答案? – 3442

+0

我喜欢你的答案,但我没有足够的声望来支持它。 – kebugcheck