2011-08-22 87 views
7

當我用g ++以及傳送可執行文件到我的大學的服務器上運行它在我的電腦編譯C++程序,我得到的libstdC++ GLIBCXX版本錯誤

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) 

程序運行以及我的電腦上,和我不沒有權利在我的大學服務器上安裝任何新軟件。

有幫助嗎? 謝謝

+0

什麼是大學的libstdC++版本? – phoxis

+0

@phoxis,3.4.8或更老,似乎。 – bdonlan

回答

7

好像在家裏連接你的程序時,您使用的是標準庫作爲共享庫(默認行爲)。

因此,鏈接器並不是真的「鏈接」庫,而是隻是解析了一些符號並執行了另一個操作,而延遲了庫的實際加載時間。

當你在你的大學計算機上執行你的程序時,加載器(實際加載你的程序在內存中並拋出主線程的程序)尋找你的程序需要的庫,並嘗試加載它們(在Linux中尋找LD_LIBRARY_PATH如果你覺得好奇)。

這裏的問題在於,你在家中將你的程序與stdlib的版本鏈接起來,該版本的版本與你在大學時的版本不同。所以當加載器試圖找到庫時,它會失敗,所以你的程序不能運行。

解決方案:

一)爲了避免這些問題,使用靜態鏈接,而不是動態鏈接。我不確定stdlib是否可行,但我認爲它是值得測試的(請參閱:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html並查找「-static」標誌)

b)您可以嘗試在大學計算機上編譯程序所以它會使用那裏的版本。

c)試着知道哪個stdlib版本安裝在那裏,並在你的編譯器中安裝相同的版本。

d)您可以嘗試將您的家庭版本的stdlib複製到您的應用程序所在的文件夾中。這通常有效,因爲加載器往往在查看環境變量中設置的路徑之前搜索當前應用程序文件夾中的共享庫LD_LIBRARY_PATH(linux)

希望有所幫助。

P.S: 這裏有一個很好的介紹,以靜VS共享/動態庫http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

和這裏(http://en.wikipedia.org/wiki/Library_%28computing%29)不那麼好,但更完整的庫描述。

+1

比'-static'更好的選擇是'-static-libstdC++',它只靜態鏈接libstdC++,而不是整個程序。 –

4

libstdc++.so.6的版本在大學計算機上太舊了。你有兩種選擇:

  1. 靜態鏈接-static。 C++庫將被合併到最終的二進制文件中。
  2. 將正確的版本複製到您的主目錄中的某個位置,然後通過在構建時傳遞-rpath /path/to/library/directory或將LD_LIBRARY_PATH環境變量設置爲指向包含較新的libstdc++.so.6的目錄來引用它。
+0

非常感謝bdonian,在大學服務器上運行時靜態鏈接是否會使程序運行速度變慢? – Tarek

+0

@Tarek,靜態鏈接有各種優點和缺點,但我不認爲你會看到很大的速度差異,真的。作爲@bdonian說 – bdonlan

+0

有許多優點和缺點,但在你的情況下,主要的將是規模。靜態鏈接的程序比動態鏈接的程序大,因爲在靜態鏈接的程序中,庫被「包含」在可執行文件中。 – thamurath

1

您試圖編譯哪些平臺?即「您的電腦」和「大學服務器」?

您可以嘗試使用靜態鏈接選項編譯您的程序。這將生成一個靜態鏈接的可執行文件,其中已經加載了所有的lib依賴項。

乾杯,

3

您可以將您的/usr/lib/libstdc++.so.6的版本複製到服務器的主目錄的子目錄,說~/lib然後運行:

$ LD_LIBRARY_PATH=$HOME/lib ./main 

或者如果你喜歡

$ export LD_LIBRARY_PATH=$HOME/lib 
$ ./main 

而且程序應該加載你的私有庫而不是系統庫。