Запуск скомпилированных программ C++ в Ubuntu 12.04 на CentOS5 Box

У меня есть куча программного обеспечения, разработанного для Linux на C++ с использованием g++. Код компилируется и работает как на Ubuntu 12.04, так и на CentOS 5. У нас есть несколько старых серверов, на которых все еще работает CentOS 5. В настоящее время я компилирую для обеих ОС. Я хочу начать использовать некоторые функции C++11. Они поддерживаются в Ubuntu 12.04, но не в CentOS 5.

Я пытаюсь создать исполняемые файлы на Ubuntu для CentOS. С этой целью я связал все исполняемые файлы с

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

Это должно сказать ему искать в /home/arcamax/lib общие библиотеки перед стандартными местоположениями. Затем я использовал «ldd» в поле Ubuntu, чтобы составить список необходимых библиотек, и скопировал эти библиотеки в /home/arcamax/lib в окне CentOS. Когда я пытаюсь запустить программы в окне CentOS, я получаю:

Когда я запускаю ldd в окне CentOS5, я получаю следующий вывод:

    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, которая все еще извлекается из системного расположения. Я не знаю, почему это так. При попытке запустить программу получаю:

ошибка перемещения: /home/arcamax/lib/libgnutls.so.26: время символа, версия GLIBC_2.2.5 не определена в файле libc.so.6 со ссылкой на время ссылки

Некоторые программы завершаются ошибкой ldd с сообщением:

не динамический исполняемый файл

Эти программы сообщают о той же ошибке, что и другие, когда я пытаюсь их запустить.


person nicktook    schedule 13.11.2012    source источник
comment
Трансплантация более новой версии libc в более старую систему сложна и чревата ошибками. Самым простым решением было бы скомпилировать все на машине с минимально возможной версией libc. Программы, скомпилированные таким образом, будут без проблем работать на более новых системах, поскольку libc обратно совместима. Но совместимости в обратную сторону нет.   -  person n. 1.8e9-where's-my-share m.    schedule 14.11.2012
comment
Если вы все равно настаиваете на том, чтобы сделать это наоборот, посмотрите здесь в принятом ответе. Вы должны разместить libc и динамический компоновщик по одинаковым путям на обеих машинах.   -  person n. 1.8e9-where's-my-share m.    schedule 14.11.2012


Ответы (1)


Не компилируйте в системе более новую версию glibc. Будет очень сложно или невозможно запустить их на машине со старой версией glibc.

Вместо этого вы должны скомпилировать в более старой системе CentOS, и двоичные файлы будут успешно работать в более новой системе.

Я хочу начать использовать некоторые функции C++11. Они поддерживаются в Ubuntu 12.04, но не в CentOS 5.

Нет, они поддерживаются версией GCC, установленной в Ubuntu 12.04, они не поддерживаются «Ubuntu». Установите ту же версию GCC на хосте CentOS, и вы сможете использовать функции C++ 11 при компиляции там.

Установить GCC легко, просто прочитайте эту вики-страницу и не пытайтесь заменить системный компилятор т.е. установить в /usr/local или /opt или $HOME или куда-нибудь кроме /usr

person Jonathan Wakely    schedule 14.11.2012