Рабочий двоичный файл человечности на CentOS со всеми совместно использованными освобождает установленные результаты в ld SIGSEGV

Если то содержание файла называют file1, file2 и file3 в порядке появления затем можно сделать это со следующей остротой:

 # python -c "x=open('file1').read(); y=open('file2').read(); print x in y or y in x"
 True
 # python -c "x=open('file2').read(); y=open('file1').read(); print x in y or y in x"
 True
 # python -c "x=open('file1').read(); y=open('file3').read(); print x in y or y in x"
 False
2
19.07.2016, 09:43
2 ответа

я предложил бы не делать этого. Обычно легче создать двоичные файлы для различных дистрибутивов в рамках процесса создания пакета того дистрибутива. На CentOS, который использовал бы rpmbuild.

, Так как вы имеете дело с VMs, это было бы намного более тривиально, чтобы установить CentOS 7 VM + инструменты сборки и затем сделать конструкцию пакета там.


Наблюдения от Пользователя основанного на источнике Распределения

я обычно не примыкаю к победившей стороне и редактирую другой ответ народов, но я зарабатываю свою репутацию здесь медленно, но конечно, помогая людям осознать различие между основанным на источнике распределением, которого существует 3 главных:

  1. Linux с нуля
  2. хинду
  3. Slackware

и основанное на двоичном файле распределение, которого существует 2 главных:

  1. Debian
  2. Redhat/Fedora

На данный момент, существует только 1 основное гибридное распределение (пересечение источника и двоичного файла):

  1. дуга Linux

, Нравится ли пользователям Linux это или нет, все другие дистрибутивы Linux, является детьми к одному из этих 6 родителей. Так как это сказан, мы идем дальше к следующему вопросу что:

Невозможно Смешать программное обеспечение От основанного на источнике Распределения с программным обеспечением в Двоичном Распределении


Знание, что это также означает, , если вы не знаете то, что вы делаете, вы не должны компилировать единственный пакет из источника на двоичном дистрибутиве . Существуют исключения к этому правилу:

  1. пакет, в котором вы нуждаетесь, не существует в вашем репозитории/дереве/и т.д. дистрибутивов (Это было причиной OP его вопроса).
  2. Вы не можете найти , Более новая версия необходимого пакета в вашем репозитории/дереве/и т.д. - Видит Маркер 9 .

, Почему OP Имеет Выпуск

С технической точки зрения, нет никакого различия в использовании пакета и создании из источника когда дело доходит до заключительного пакета, т.е. если можно создать пакет успешно, и это работает, никто не даст сбой вы для того, чтобы сделать его. Необходимо помнить что, когда вы делаете это, хотя, что инструменты вы раньше создавали ваше приложение на одном основанном на двоичном файле распределении, больше, чем версии инструментов, доступных в другом двоичном распределении. То, что видит OP, является дельтой или изменением, между старыми и новыми пакетами. Дельта или изменение вызываются Пакетом и Специалистами по обслуживанию ОС Каждой ОС,быть этим один из 6 выше, или дети, выбрав, какой пакет они отметят стабильный для их ОС. После того как пакет выбран в Двоичном Распределении, большинство раз он замораживается до следующего выпуска, если Критическая Ошибка не Открыта.

А основанное на источнике Распределение, с другой стороны, может принять решение обновить предметы, как только новые источники доступны, таким образом bugfixing на лету.

Это - То, почему OP Имеет Проблемы

план выпуска, и цикл обновления для Ubuntu принял решение принять новые версии Набор инструментальных средств Сборки , прежде чем CentOS принял их. Так как CentOS основан на устойчивости, Набор инструментальных средств Сборки не может быть обновлен до их следующего главная версия . Как таковой OP испытывал выпуск , подобный этому , потому что Набор инструментальных средств Сборки Ubuntu поддерживает C++ 11, и CentOS делает, только когда все несоответствия версии восстанавливаются и позже столкнутся с проблемами с использованием нескольких Диспетчеров пакетов.

, Что OP Должен был Сделать

  1. Определенный Инструменты Сборки, Доступные для системы, в которой будет находиться Пакет. В этом случае это был бы CentOS. Вот страница о том, как установить их Должным образом . Согласно списку в предыдущей ссылке, тот компилятор поддерживает C++ 11. Как очень опытная догадка несоответствие версии OP происходит или в binutils или в libtool Binutils зависит от glibc, и libtool зависит от binutils, поэтому , libtool косвенно зависит от glibc, который я не объясню, почему почти каждый пакет в любой системе косвенно зависит от , glibc просто знает, что делает.
  2. , Если бы Набор инструментальных средств Сборки, после надлежащей установки, не поддерживал C++ 11, OP был бы вынужден использовать C++ 98 для облегчения проблемы, с которой он сталкивается теперь.
  3. обновлявший Набор инструментальных средств Сборки на Шаге 1 выше, OP должен теперь скомпилировать его исходный код в CentOS VM и восстановить/устранить по мере необходимости. Если OP требует пакета, он должен использовать rpmbuild, как это сообщение предполагает, поскольку это - собственный диспетчер пакетов к VM, где пакет находится. Конфетка НЕ является диспетчером пакетов. Конфетка ЯВЛЯЕТСЯ Сопоставителем Зависимости

Ссылки

  1. Список дистрибутивов Linux
  2. C++ 0x/C ++ 11 Поддержки в новостях GCC
  3. , Состоянии и Дискуссии о Стандарте C++
4
27.01.2020, 22:00

OP решение и выводы

На основании предыдущих ответов здесь представлено решение, которое я закончил.


1. Скопируйте исходный код

Скопируйте исходный код на ВМ или другую машину. Я использовал :

scp -R /host/path/to/src/ user@remoteHost:/remote/build/path/

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

2. Установка зависимостей (libs/build tools)

Перевернутая ВМ для базовой установки (centOS7 min) и обновленные инструменты, используемые для сборки моего приложения, на основе проб и ошибок (yum search, install, try build command)

yum -y update
yum -y install boost-*      #probably could have used only boost-devel
yum -y install glibc-utils
yum -y install gcc-c++
yum -y install git
yum -y install libtool       
yum -y install zlib-devel    
yum -y install ncurses-devel 
yum -y install make          
yum -y install cmake         
yum -y install openssl-devel 
yum -y install libssh2-devel
...

Если ваш проект зависит от (более новых) библиотек, недоступных в репозитории ОС, установите из исходных текстов:

Например, мне нужны curl, собранный с помощью c-ares, и обновленная клиентская библиотека mysql.

#mysqlclient
if [[ -z $(ldconfig -p | grep libmysqlclient) ]]
then
    mkdir -p "${INSTALL_PREQ_PATH}/lib/mysql/";
    cd "${INSTALL_PREQ_PATH}lib/mysql/"
    wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    yum -y localinstall mysql-community-release-el7-5.noarch.rpm
    sudo yum install mysql-community-client
    sudo yum install mysql-community-devel
fi


#c-ares
if [[ -z $(ldconfig -p | grep libcares) ]]
then
    mkdir -p "${INSTALL_PREQ_PATH}lib/libcares/"
    cd "${INSTALL_PREQ_PATH}lib/libcares/"
    git clone git://github.com/bagder/c-ares.git
    cd c-ares
    ./buildconf
    ./configure
    make
    sudo make install
    ldconfig
fi

#libcurl
if [[ -z $(ldconfig -p | grep libcares) ]]
then
    mkdir -p "${INSTALL_PREQ_PATH}lib/libcurl/"
    cd "${INSTALL_PREQ_PATH}lib/libcurl/"
    wget http://curl.haxx.se/download/curl-7.39.0.tar.gz
    tar -xvzf curl-7.39.0.tar.gz
    cd curl-7.39.0
    ./configure --enable-ares --with-libidn --with-zlib --disable-ipv6
    make
    sudo make install
    ldconfig
fi

Obs: Каждая сборка поставляется со своими собственными зависимостями, которые были добавлены к вышеуказанному шагу.

3. Установлена зависимость Foreach, проверьте, работает ли она, и проверьте, не сломали ли вы что-нибудь

Проверьте, загружены ли библиотеки системой:

ldconfig                    # update library cache
ldconfig -p | grep libcurl  # check for library

В моем случае библиотеки были установлены в папку /usr/local/lib/, которая по умолчанию не включена в путь поиска сборщика ссылок. Чтобы исправить это, выполните следующие действия:

echo "/usr/local/lib/">/etc/ld.so.conf.d/local.conf    #add lib search path
ldconfig                                               #reload library cache

Также проверьте, работают ли другие программы, использующие эту разделяемую библиотеку. В моем случае установка curl сломала yum, так как отсутствовал ssh и ssl, исправление:

rm /etc/ld.so.conf.d/local.conf              #remove the new libs search path
ldconfig                                     #reload
yum install openssl-devel                    #install ssl dependency
yum install libssh2-devel                    #install ssh dependency
cd "${INSTALL_PREQ_PATH}lib/libcurl/"        #go to libcurl source path
./configure --enable-ares --with-libidn --with-zlib --disable-ipv6 --with-ssl --with-libssh2   # configure build with ssl and ssh
make                                         #compile
sudo make install                            #install binary, libs and headers
echo "/usr/local/lib/">/etc/ld.so.conf.d/local.conf    #add lib search path
ldconfig                                               #reload library cache

4. Собирайте свою программу

В моем случае я использовал тот же компилятор, что и на ubuntu, gcc-c++ (g++). В случае, если он не работает:

  • Посмотрите, нет ли какой-либо зависимости, почитайте предупреждения и ошибки
  • Проверьте версию компилятора на обеих машинах, проверьте, есть ли различия в поддержке вашего кода и флагов компилятора, воспользуйтесь Интернетом для поиска путей обновления компилятора для вашей ОС

Другие примечания:

  • Запишите свои шаги, желательно в бэш-скрипте, чтобы можно было повторить попытку или (пере)установить на другую машину.
  • Это не очень хороший совет для производственной машины, запустите пробную установку где-нибудь в другом месте.
  • Если вы используете VM, делайте снимки, в противном случае делайте резервное копирование, и всегда будьте готовы к неудаче
  • Не следуйте моим советам, это то, что сработало для меня, это может не сработать для всех, и может быть плохим выбором для других случаев. Я не эксперт, просто пишу, чтобы помочь другим нобам вроде меня :)
0
27.01.2020, 22:00

Теги

Похожие вопросы