2012-11-13 67 views
1

我有一堆使用g ++在C++上在Linux上開發的軟件。代碼編譯並在Ubuntu 12.04和CentOS 5上運行。我們有一些舊的服務器仍在運行CentOS 5.目前,我爲兩種操作系統編譯。我想開始使用一些C++ 11功能。這些在Ubuntu 12.04上支持,但不支持CentOS 5.在CentOS5 Box上運行Ubuntu 12.04編譯的C++程序

我試圖在Ubuntu上爲CentOS生成可執行文件。爲了達到這個目的我已經聯繫所有的可執行文件與

-Wl,-rpath,/home/arcamax/lib

這應該告訴它在尋找的/ home/arcamax/lib目錄的標準位置之前共享庫。然後,我使用Ubuntu盒上的'ldd'來構建所需庫的列表,並將這些庫複製到CentOS盒子上的/ home/arcamax/lib。當我嘗試在CentOS的框運行的程序,我得到:

當我在CentOS5框運行LDD我得到的輸出是這樣的:

libcrypto.so.1.0.0 => /home/arcamax/lib/libcrypto.so.1.0.0 (0x00002b3557f54000) 
    libpq.so.5 => /home/arcamax/lib/libpq.so.5 (0x00002b355831c000) 
    libstdc++.so.6 => /home/arcamax/lib/libstdc++.so.6 (0x00002b3558548000) 
    libm.so.6 => /home/arcamax/lib/libm.so.6 (0x00002b3558849000) 
    libgcc_s.so.1 => /home/arcamax/lib/libgcc_s.so.1 (0x00002b3558b43000) 
    libc.so.6 => /home/arcamax/lib/libc.so.6 (0x00002b3558d59000) 
    libpthread.so.0 => /home/arcamax/lib/libpthread.so.0 (0x00002b3559117000) 
    libdl.so.2 => /home/arcamax/lib/libdl.so.2 (0x00002b3559334000) 
    libz.so.1 => /home/arcamax/lib/libz.so.1 (0x00002b3559538000) 
    libssl.so.1.0.0 => /home/arcamax/lib/libssl.so.1.0.0 (0x00002b3559750000) 
    libkrb5.so.3 => /home/arcamax/lib/libkrb5.so.3 (0x00002b35599ac000) 
    libcom_err.so.2 => /home/arcamax/lib/libcom_err.so.2 (0x00002b3559c7a000) 
    libgssapi_krb5.so.2 => /home/arcamax/lib/libgssapi_krb5.so.2 (0x00002b3559e7f000) 
    libldap_r-2.4.so.2 => /home/arcamax/lib/libldap_r-2.4.so.2 (0x00002b355a0bd000) 
    /lib64/ld-linux-x86-64.so.2 (0x00000035aa800000) 
    libk5crypto.so.3 => /home/arcamax/lib/libk5crypto.so.3 (0x00002b355a30d000) 
    libkrb5support.so.0 => /home/arcamax/lib/libkrb5support.so.0 (0x00002b355a535000) 
    libkeyutils.so.1 => /home/arcamax/lib/libkeyutils.so.1 (0x00002b355a73d000) 
    libresolv.so.2 => /home/arcamax/lib/libresolv.so.2 (0x00002b355a942000) 
    liblber-2.4.so.2 => /home/arcamax/lib/liblber-2.4.so.2 (0x00002b355ab5e000) 
    libsasl2.so.2 => /home/arcamax/lib/libsasl2.so.2 (0x00002b355ad6c000) 
    libgssapi.so.3 => /home/arcamax/lib/libgssapi.so.3 (0x00002b355af88000) 
    libgnutls.so.26 => /home/arcamax/lib/libgnutls.so.26 (0x00002b355b1c6000) 
    libgcrypt.so.11 => /home/arcamax/lib/libgcrypt.so.11 (0x00002b355b482000) 
    libheimntlm.so.0 => /home/arcamax/lib/libheimntlm.so.0 (0x00002b355b701000) 
    libkrb5.so.26 => /home/arcamax/lib/libkrb5.so.26 (0x00002b355b908000) 
    libasn1.so.8 => /home/arcamax/lib/libasn1.so.8 (0x00002b355bb8e000) 
    libhcrypto.so.4 => /home/arcamax/lib/libhcrypto.so.4 (0x00002b355be2f000) 
    libroken.so.18 => /home/arcamax/lib/libroken.so.18 (0x00002b355c063000) 
    libtasn1.so.3 => /home/arcamax/lib/libtasn1.so.3 (0x00002b355c278000) 
    libp11-kit.so.0 => /home/arcamax/lib/libp11-kit.so.0 (0x00002b355c48a000) 
    libgpg-error.so.0 => /home/arcamax/lib/libgpg-error.so.0 (0x00002b355c69c000) 
    libwind.so.0 => /home/arcamax/lib/libwind.so.0 (0x00002b355c8a0000) 
    libheimbase.so.1 => /home/arcamax/lib/libheimbase.so.1 (0x00002b355caca000) 
    libhx509.so.5 => /home/arcamax/lib/libhx509.so.5 (0x00002b355ccd9000) 
    libsqlite3.so.0 => /home/arcamax/lib/libsqlite3.so.0 (0x00002b355cf23000) 
    libcrypt.so.1 => /home/arcamax/lib/libcrypt.so.1 (0x00002b355d1c7000) 

注意有一個lib下,/ lib64下/ LD- linux-x86-64.so.2,這仍然是從系統位置拉出來的。我不知道這是爲什麼。當我嘗試運行該程序,我得到:

relocation error: /home/arcamax/lib/libgnutls.so.26: symbol time, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference

幾個項目的失敗ldd操作消息:當我試圖運行它們

not a dynamic executable

這些程序報告相同的錯誤的人。

+1

移栽的libc的新版本爲一個較舊系統中的其他是困難和容易出錯的。最簡單的解決方案是使用最低版本的libc編譯機器上的所有內容。以這種方式編譯的程序將在新系統上運行,因爲libc是向後兼容的。但是在相反的方向上沒有兼容性。 –

+0

如果你堅持以相反的方式做到這一點,在接受的答案看看[這裏](http://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host)。您應該將libc和動態鏈接程序放在兩臺機器上相同的路徑上。 –

回答

0

不要在系統上使用新的glibc進行編譯。使用舊的glibc在機器上運行它們將非常困難或不可能。

相反,您應該在較舊的CentOS系統上進行編譯,並且二進制文件將很樂意在較新的系統上運行。

I want to start using some C++11 features. These are supported on Ubuntu 12.04 but not CentOS 5.

不,它們受到恰好安裝在Ubuntu 12.04上的GCC版本的支持,它們不受「Ubuntu」支持。在CentOS主機上安裝相同的GCC版本,並在編譯時使用C++ 11功能。

Installing GCC是容易的,剛纔讀的wiki頁面,不要試圖取代你的系統的編譯器,即安裝到/usr/local/opt$HOME或地方比/usr