在CentOS5 Box上运行Ubuntu 12.04编译的C ++程序

时间:2012-11-13 20:38:02

标签: linux g++ ubuntu-12.04 centos5 relocation

我使用g ++在C ++上用Linux开发了一堆软件。代码在Ubuntu 12.04和CentOS 5上编译和运行。我们有一些旧的服务器仍在运行CentOS 5.目前我为两个操作系统编译。我想开始使用一些C ++ 11功能。这些在Ubuntu 12.04上受支持,但不支持CentOS 5.

我正在尝试在Ubuntu for CentOS上生成可执行文件。为此,我已将所有可执行文件与

链接起来
  

-Wl,-rpath,/家庭/ 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 / ldl -x86-64.so.2仍在从系统位置拉出。我不知道为什么会这样。当我尝试运行程序时,我得到:

  

重定位错误:/home/arcamax/lib/libgnutls.so.26:符号时间,版本GLIBC_2.2.5未在文件libc.so.6中定义,带有链接时间参考

一些程序失败,并显示消息:

  

不是动态可执行文件

当我尝试运行它们时,这些程序会报告与其他程序相同的错误。

1 个答案:

答案 0 :(得分:0)

不要使用较新的glibc在系统上进行编译。使用较旧的glibc在机器上运行它们是非常困难或不可能的。

相反,您应该在较旧的CentOS系统上进行编译,并且二进制文件将很乐意在较新的系统上运行。

  

我想开始使用一些C ++ 11功能。这些在Ubuntu 12.04上受支持,但不支持CentOS 5.

不,它们得到了UCCntu 12.04上安装的GCC版本的支持,“Ubuntu”不支持它们。在CentOS主机上安装相同的GCC版本,在编译时可以使用C ++ 11功能。

Installing GCC很简单,只需阅读该wiki页面,不要尝试替换您的系统编译器,即安装到/usr/local/opt$HOME或其他地方比/usr