Я не могу запустить программу на С++ в Debian (Ubuntu), которая работает в Redhat (Centos)

TL;DR: возникла проблема с компиляцией программы на С++, которая работала в Centos Redhat в Ubuntu Debian. Есть ли что-нибудь, что я должен знать о двух этих двух, которые бы не скомпилировали С++-программу с использованием того же самого компилятора?

Здравствуйте, я пытаюсь скомпилировать и запустить Germline (http://www1.cs.columbia.edu/~gusev/germline/). Он отлично работает в RedHat Centos, но поскольку Centos не поддерживается так, как Ubuntu для большинства вещей, которые я переключил. И теперь эта программа не работает. Вполне возможно, что он использует какую-то функциональность RedHat, но я использую тот же компилятор (g++), чтобы скомпилировать его в обеих средах.

Я вытаскиваю свои волосы, пытаясь заставить эту работу работать на Ubuntu, так как с ней гораздо приятнее работать, но на данный момент, когда я "делаю все" проект в ubuntu, он будет компилироваться и тесты (никогда не заканчивайте) навсегда. Независимо от того, какие двоичные файлы я использую (скомпилированные в Centos и скопированные, неудачные тестовые двоичные файлы, о которых я только что упомянул и т.д.), Программа всегда зависает.

Давно, извините. Мой главный вопрос: есть ли другие альтернативы компилятора С++, которые я могу попробовать? Есть ли какие-либо библиотеки С++ Red Hat, которые могут отсутствовать. Или основные различия в их реализациях на С++, которые могут привести к этому?

Ответ 1

Я посмотрел программное обеспечение. Этот код ввода немного хрупкий, и я не уверен, что библиотека Ubuntu или Red Hat С++ в этом случае глючит, но программа может быть легко исправлена ​​для работы на обоих.

В файле PEDIndividualsExtractor.cpp, в функции void PEDIndividuasExtractor::loadInput(), измените строку:

while (!stream.eof() )

в

while (stream)

и перекомпилируйте.

Ответ 2

Использование while(!stream.eof()) является распространенной ошибкой. Если утверждение stream.eof() истинно, то нет необходимости, чтобы последняя операция с потоком была успешной.

Вот несколько bash script для компиляции пакета с GNU g++4.6:

wget http://www1.cs.columbia.edu/~gusev/germline/germline-1-5-1.tar.gz
tar -xzvf germline-1-5-1.tar.gz
cd germline-1-5-1/
perl -p -i.bak -e's/!stream\.eof\(\)/stream/g' PEDIndividualsExtractor.cpp
perl -p -i.bak -e's/!stream_sample.eof\(\)/stream_sample/g' HMIndividualsExtractor.cpp
make all
cat test/generated.out

Ответ 3

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

Любой достойный пакет поставляется со списком зависимостей, вы проверили это и проверили требования?

При отсутствии списка требований и зависимостей в этой ситуации хорошее правило состоит в том, чтобы проверить, что такое первая ошибка, и исправить это. Например, если первая ошибка говорит "missing foolib.h", тогда вам нужно установить "foolib" для этой машины.

Ответ 4

  • Сделайте make all как свой собственный шаг, затем проверьте, что все скомпилировано в порядке.
  • Запустите make tests, затем проверьте, какие тесты терпят неудачу.

Это ваши первые шаги и, возможно, вы получите большую часть этого пути.

Как уже упоминал PenguinCoder, вам нужно проверить, что версии компилятора одинаковы между Ubuntu и Redhat. Каждый раз, когда в gcc произошло значительное обновление версии, у меня были некоторые (незначительные) проблемы.

Ответ 5

Если вам нужна только программа на Ubuntu, вы можете настроить программу с помощью --static для компиляции статического исполняемого файла, а затем скопировать исполняемый файл в Ubuntu.

Или вы можете использовать команду ldd, чтобы найти файлы .so с динамическим исполняемым файлом, связанным с ними, и скопировать эти файлы .so в один и тот же каталог динамического исполняемого файла и поместить их в Ubuntu для запуска. Вы также можете поместить файлы .so в другой каталог и использовать LD_LIBRARY_PATH, чтобы помочь исполняемому файлу найти файлы .so.