TLDR: возникли проблемы при компиляции программы на C ++, которая работала в Centos Redhat в Ubuntu Debian. Есть ли что-то, что я должен знать между этими двумя, что сделает программу C ++, скомпилированную с использованием одного и того же компилятора, не работает?
Здравствуйте, я пытаюсь скомпилировать и запустить Germline (http://www1.cs.columbia.edu/~gusev/germline/). Он прекрасно работает в RedHat Centos, но поскольку Centos не так поддерживается, как Ubuntu для большинства вещей, которые я переключил. И сейчас эта программа не работает. Вполне возможно, что он использует какую-то функциональность только для RedHat, но я использую один и тот же компилятор (g ++) для компиляции в обеих средах.
Я дергал себя за волосы, просто пытаясь заставить эту штуку работать на Ubuntu, так как с ней гораздо приятнее работать, но на данный момент, когда я «сделаю все» для проекта в Ubuntu, он скомпилируется и тесты будут крутиться (Дон никогда не закончить) навсегда. Независимо от того, какие двоичные файлы я использую (скомпилированные в Centos и скопированные, неудачные тестовые двоичные файлы, которые я только что упомянул и т. Д.), Программа просто всегда зависает.
Вроде долго, прости. Мой главный вопрос заключается в следующем: есть ли другие альтернативы компилятора C ++, которые я могу попробовать? Есть ли библиотеки Red-hat C ++, которые я мог бы пропустить. Или серьезные различия в их реализациях на C ++, которые могут вызвать это?
Я посмотрел на программное обеспечение. Его входной код немного хрупок, и я не уверен, что в этом случае глючит библиотека C ++ в Ubuntu или Red Hat, но программа может быть легко исправлена для работы с обоими.
В файле PEDIndividualsExtractor.cpp
в функции void PEDIndividuasExtractor::loadInput()
измените строку:
while (!stream.eof() )
чтобы:
while (stream)
и перекомпилировать.
Использование while(!stream.eof())
это распространенная ошибка Если заявление stream.eof()
Это правда, то это не обязательно означает, что последняя операция с потоком прошла успешно.
Вот несколько скриптов bash для компиляции пакета с 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
Вы должны указать, что на самом деле является первой ошибкой, вы не предоставили достаточно информации, чтобы сказать, в чем проблема, однако я бы предположил отсутствующую зависимость.
Любой приличный пакет поставляется со списком зависимостей, вы проверили это и проверили требования?
В отсутствие требований и списка зависимостей хорошим правилом в этой ситуации является проверка самой первой ошибки и ее исправление. Например, если первая ошибка говорит «отсутствует foolib.h», то вам нужно установить «foolib» для этой машины.
make all
как собственный шаг, затем проверьте, что все скомпилировано в порядке.make tests
, затем проверьте, какие тесты не пройдены.Это ваши первые шаги, и они могут помочь вам в этом.
Как сказано выше в PenguinCoder, вам нужно убедиться, что версии компилятора одинаковы для Ubuntu и Redhat. Каждый раз, когда в основной версии gcc
У меня были некоторые (незначительные) проблемы.
Если вам нужно использовать программу только в Ubuntu, вы можете настроить программу с помощью --static
скомпилировать статический исполняемый файл, а затем скопировать исполняемый файл в Ubuntu.
Или вы можете использовать ldd
командовать выяснить .so
файлы динамический исполняемый файл, связанный с и скопировать эти .so
файлы в тот же каталог динамического исполняемого файла и поместите их в Ubuntu для запуска. Вы также можете положить .so
файлы в другом каталоге и использовать LD_LIBRARY_PATH
чтобы помочь исполняемому файлу найти .so
файлы.