1

g++を使用してC++でLinux上で開発されたソフトウェアがたくさんあります。このコードは、Ubuntu 12.04 と CentOS 5 の両方でコンパイルおよび実行されます。まだ CentOS 5 を実行している古いサーバーがいくつかあります。現在、両方の OS 用にコンパイルしています。C++11 の機能を使い始めたいと思っています。これらは Ubuntu 12.04 ではサポートされていますが、CentOS 5 ではサポートされていません。

CentOS 用の Ubuntu で実行可能ファイルを作成しようとしています。その目的のために、すべての実行可能ファイルをリンクしました

-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)

/lib64/ld-linux-x86-64.so.2 という 1 つの lib があることに注意してください。これはまだシステムの場所からプルされています。なぜだかわかりません。プログラムを実行しようとすると、次のようになります。

再配置エラー: /home/arcamax/lib/libgnutls.so.26: シンボル時間、バージョン GLIBC_2.2.5 がファイル libc.so.6 で定義されていません (リンク時間参照あり)

一部のプログラムは、次のメッセージで ldd に失敗します。

動的実行可能ファイルではありません

これらのプログラムを実行しようとすると、他のプログラムと同じエラーが報告されます。

4

1 に答える 1

0

新しい glibc を使用するシステムでコンパイルしないでください。古い glibc を使用しているマシンでそれらを実行することは非常に困難または不可能です。

代わりに、古い CentOS システムでコンパイルする必要があり、バイナリは新しいシステムで問題なく実行されます。

C++11 の機能を使い始めたいと思っています。これらは Ubuntu 12.04 ではサポートされていますが、CentOS 5 ではサポートされていません。

いいえ、Ubuntu 12.04 にインストールされている GCC バージョンでサポートされています。「Ubuntu」ではサポートされていません。CentOS ホストに同じ GCC バージョンをインストールすると、そこでコンパイルするときに C++11 機能を使用できます。

GCC のインストールは簡単です。その wiki ページを読むだけです。システム コンパイラを置き換えようとしない/usr/localでください/opt$HOME/usr

于 2012-11-14T02:06:40.837 に答える