2015-11-12 68 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