2013-11-21 47 views
0

我使用GCC在Ubuntu 13上編譯C++應用程序。我希望能夠在我的代碼中使用C++ 11功能,但同時仍然能夠生成一個二進制文件,我的用戶可以在舊版本的Ubuntu上運行。舊版發行版本上的二進制兼容性(使用C++ 11)

如果我編譯在Ubuntu 13 GCC我二進制文件的最新版本,將無法在Ubuntu上運行12 glibc的,因爲不向前兼容: (How compatible are different versions of glibc?

  • 我有哪些選擇?

  • 這甚至可能沒有要求我的用戶跳過大規模的箍?

  • 如果不是,我的用戶必須做些什麼才能運行二進制文件(即他們可以在較舊版本的Ubuntu上安裝更新的glibc)?

注:我不不想考慮靜態鏈接glibc的,因爲:

  1. 我讀過,這是一個非常糟糕的主意
  2. 許可問題
  3. 交叉分佈兼容性問題

目前我的應用程序沒有使用任何C++ 11功能,並且我在較早版本的Ubuntu wi上編譯一箇舊版本的GCC來避免這個問題。但它使我傷心不能夠使用最新和最偉大的語言特點:(

+0

鏈接靜態。許可問題將以任何方式存在,而且是靜態編譯的程序 - 因爲它包含了所需的所有內容,而不是依賴最終用戶的庫 - 可以在基本上使用相同CPU的任何Linux系統上運行。 – cHao

+0

只需在較舊的操作系統上使用較新的gcc編譯即可。從源代碼或手動添加的存儲庫安裝gcc。您可能需要靜態鏈接libstdC++,或者使用您的程序分發libstdC++的副本(我認爲這是合法的,如果您還發布libstdC++源代碼; IANAL,請諮詢您的法律部門)。 –

+1

@cHao,我讀過很多關於靜態鏈接glibc的SO問題,許多人似乎表明這是一個壞主意。例如(http://stackoverflow.com/a/11654451/966782)​​。另外,關於靜態鏈接的LGPL讓我感到恐慌。我想避免它... – pqvst

回答

0

你問「我如何使用代碼是不是在舊系統」。

答案是當然的, 「包含你的項目的代碼」

如果你想通過你所問的問題,你會發現在任何情況下,你都需要libstdC++中的C++ 11函數的代碼。他們不在Ubuntu 12上,你必須添加它們,因此,你必須有靜態鏈接,這是確保它可以在任意ubuntu12系統上運行的唯一方法。那麼你可以做一個奇特的安裝,但最終,它只是你的應用程序「動態鏈接」到libstdC++,所以它可能是靜態鏈接,因爲沒有其他程序將在它尋找它ubuntu12

0

通常,只有使用相同的編譯器和(!)編譯器的版本匹配時,才能兼容C++庫(但您可能很幸運)。除了編寫C代碼之外,沒有辦法在這個意義上進行移植。

1

您可以嘗試使用Boost庫,它們與C++ 11具有完全相同的特性,並且與C++ 11相比具有更多的復古兼容性:它可以在較早版本的Ubuntu上輕鬆編譯。

否則最好的選擇可能是問到Ubuntu 12.04的用戶有升級GCC 4.6至4.7或更近: http://www.swiftsoftwaregroup.com/upgrade-gcc-4-7-ubuntu-12-04/