2012-10-19 31 views
8

發行版之間是否存在任何特性或變體,這些特性或變體會影響使用GCC 4.7.x編譯的C++二進制文件,而在一個發行版上直接使用另一個發行版?我理解理想的情況是從第二個發行版源代碼編譯,但我真的不想擔心在我的生產機器上編譯新的GCC版本和程序源代碼。我是一個相對缺乏經驗的Linux用戶(因此這個問題!),仍然更喜歡IDE而不是命令行編譯,ssh是我真正可以用來訪問生產計算機的所有東西。在另一個Linux發行版上使用g ++編譯的可執行文件是否受到限制?

代碼本身沒有什麼意思,但它確實利用了一些運行的操作系統設施,如阻塞套接字等。

任何意見將不勝感激!

+4

答案在很大程度上取決於如果鏈接靜態或動態 – PlasmaHH

+2

應該沒有問題,除非一個是64位的,另一個是32位,或者如果他們有顯著不同版本的各種共享的庫已安裝。如果你想要最大的可移植性,你應該使它靜態鏈接。 –

+3

@PaulTomblin:如果你想最大限度的移植,你應該從源代碼編譯。 –

回答

5

除非二進制文件是建立在完全相同相同的操作系統(包括版本)和完全相同同一硬件沒有保證。

在實踐中:

  1. 如果硬件是同一個家族芯片的它應該工作。

    • 這是因爲大多數人不打開硬件特定的優化(但他們可以)。
    • 整個芯片組的移動二進制文件是極不可能的工作
    • 移動二進制文件從舊到硬件家族的新成員很可能工作
    • 移動二進制文件從更新到老成員的硬件家庭不太可能(但將取決於優化和編譯器設置(IR從64到32位架構的移動不太可能工作)。
  2. 如果操作系統有相同的主設備號,那麼它應該(可能)的工作。

    • 二進制文件可以跨越的操作系統版本將取決於用於構建它的編譯器版本和主機操作系統。
    • 如果編譯器在生成ABI時發生變化,則所有投注都將關閉。但通常由編譯器生成的ABI變化將是一個主要問題,因此只會發生在操作系統路線圖中的主要點(而不是輕微增量)。
  3. 從源頭我的建議版本。

    • 請不要特意出去和更新開發環境(使用分發版附帶的版本(如果您進行默認更新,它們不會破壞向後兼容性))。
    • 建築很簡單,只需閱讀README文件。但通常它涉及運行兩個命令./configuremake。如果你不想要任何特別的東西,你通常不需要做其他事情。
+0

感謝您的徹底解答。非常感激!我特別談論最新的GCC版本的主要原因是我對新的C++ 11功能非常感興趣。我對構建GCC和一些依賴關係(MPFR和其他兩個我已經忘記名稱的)在生產機器上的編譯時間/資源使用情況以及擔心維護另一個GCC安裝感到舒服(或多或少)感到尷尬。我*不知道該怎麼做(但我想有時間學習)是從終端編譯我自己的項目(嘿,我吸!)或正確使用makefile。 – Elliott

+0

我真的希望先嚐試一下,然後再考慮從源代碼開始構建,當時我覺得這樣做更舒服。代碼本身都是非常高級的東西,我能找到的最不便攜的東西是一個或兩個掩碼。基於你的回答,我已經考慮了以下內容:兩個CPU都來自運行64位Linux的大致相同供應商系列的x64,發行版是最新版本,因此可能具有非常類似的內核版本。基於此,我認爲這可能是值得一試的。再次感謝您的寶貴意見! – Elliott

+0

還有一件事,如果你願意:這裏玩耍的因素究竟是什麼?正如我「理解」(從一個鬆散的角度)它,它們是:生成的指令的可移植性,ABI,涉及的運行時庫的版本(假如靜態鏈接,可能是微不足道的),以及用於套接字等任何操作系統庫的版本(這是由內核版本決定的?)。但我可能仍然在咆哮錯誤的樹! :) – Elliott

0

一般而言,基於較新版本構建的二進制文件不適用於舊版本,但構建於較早版本上的二進制文件將適用於較新的版本。 現在,如果您在RedHat EL4上構建二進制文件,它將支持大多數發行版(如果缺失,您可能需要複製libstdC++)

3

G ++在一段時間內有穩定的ABI,所以不應該造成問題。什麼可能導致問題是使用動態鏈接庫。運行該程序的系統需要具有可執行文件所針對的任何共享庫的兼容版本。如果你只使用靜態鏈接,你不應該有問題。您可以通過使用-static選項打開靜態鏈接。

+2

不幸的是,沒有更真實的了。 G ++ 4.7.0和4.7.1有一些影響ABI的stdlib變更,4.7.2有ABI不兼容性[「fixed」](http://gcc.gnu.org/gcc-4.7/changes.html),這基本上意味着4.7.0,4.7.1和4.7.2都不兼容以前的任何版本或與其他任何版本兼容。 – Damon

+0

感謝您的答案,並感謝@Damon的信息,非常有幫助!我沒有確定我有沒有正確的運行時庫等,但我不知道我在找什麼,直到我讀到:) – Elliott

3

隨着靜態鏈接,兩個條件必須滿足:

1)目標系統和構建系統必須是相同的體系結構的(有例外:可以運行於許多64位主機32位二進制)

2)(G)的libc包在目標系統上必須不大於在構建系統上較舊版本(有時你可以逃脫次版本差異)

它得到與動態鏈接更復雜。

+0

爲什麼特別是glibc? – qdii

+0

另外,如果我不需要其他任何東西,你能保證,如果我用GCC開關編譯我的代碼「-march = corei7」它可以在所有的64位平臺上工作嗎? – qdii

+0

@qdii通過它的聲音,這裏沒有任何保證可以在這裏交配! – Elliott

相關問題