Je ne peux pas exécuter un programme C ++ dans Debian (Ubuntu) qui fonctionne dans Redhat (Centos)

TLDR: difficulté à comstackr un programme C ++ qui fonctionnait dans Centos Redhat dans Ubuntu Debian. Y a-t-il quelque chose dont je devrais être conscient entre ces deux éléments qui empêcheraient un programme C ++ compilé en utilisant le même compilateur de fonctionner?

Bonjour, j’essaie de comstackr et d’exécuter Germline (http://www1.cs.columbia.edu/~gusev/germline/). Cela fonctionne très bien dans RedHat Centos, mais parce que Centos n’est pas aussi pris en charge que Ubuntu, c’est pour la plupart des choses que j’ai changées. Et maintenant, ce programme ne fonctionne pas. Il est tout à fait possible qu’il utilise une sorte de fonctionnalité RedHat uniquement, mais j’utilise le même compilateur (g ++) pour le comstackr dans les deux environnements.

Je me suis démené juste pour essayer de faire fonctionner cette chose sur Ubuntu car c’est beaucoup plus agréable de travailler, mais à partir de maintenant, quand je “fais tout” le projet dans Ubuntu, il comstackra et les tests tourneront (Don ne jamais finir) pour toujours. Quels que soient les binarys que j’utilise (compilés dans Centos et copiés, les binarys de test ayant échoué que je viens de mentionner, etc.), le programme se bloque toujours.

Un peu long, désolé. Ma question principale est la suivante: y a-t-il d’autres alternatives au compilateur C ++ que je peux essayer? Existe-t-il des bibliothèques C ++ Red-hat qui pourraient me manquer? Ou des différences majeures dans leurs implémentations C ++ qui peuvent causer cela?

J’ai regardé le logiciel. Son code d’entrée est un peu fragile, et je ne suis pas certain que la bibliothèque C ++ d’Ubuntu ou Red Hat soit boguée dans ce cas, mais le programme peut facilement être corrigé pour fonctionner sur les deux.

Dans le fichier PEDIndividualsExtractor.cpp , dans la fonction void PEDIndividuasExtractor::loadInput() , modifiez la ligne:

 while (!stream.eof() ) 

à:

 while (stream) 

et recomstackr.

L’utilisation de while(!stream.eof()) est une erreur courante. Si l’instruction stream.eof() est vraie, cela ne signifie pas nécessairement que la dernière opération avec le stream est réussie.

Voici quelques scripts bash pour comstackr le paquet avec 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 

Vous devez spécifier quelle est la première erreur, vous n’avez pas fourni suffisamment d’informations pour dire quel est le problème, mais je devine une dépendance manquante.

Tout paquet décent est livré avec une liste de dépendances, avez-vous vérifié cela et vérifié que les exigences sont là?

En l’absence d’une liste des exigences et des dépendances, une bonne règle à suivre dans cette situation est de vérifier quelle est la toute première erreur et de la corriger. Par exemple, si la première erreur indique “foolib.h manquant”, vous devez installer “foolib” pour cette machine.

  1. Faites make all comme sa propre étape, puis vérifiez que tout est bien compilé.
  2. Exécutez make tests , puis vérifiez les tests qui échouent.

Ce sont vos premiers pas et pourraient vous aider à atteindre vos objectives.

Comme le dit PenguinCoder ci-dessus, vous devez vérifier que les versions du compilateur sont les mêmes entre Ubuntu et Redhat. Chaque fois qu’il y a eu une mise à niveau d’une version majeure de gcc , j’ai eu des problèmes (mineurs).

Si vous avez seulement besoin d’utiliser le programme sur Ubuntu, vous pouvez configurer le programme avec --static pour comstackr un exécutable statique, puis copier l’exécutable sur Ubuntu.

Ou bien, vous pouvez utiliser la commande ldd pour savoir .so fichiers .so l’exécutable dynamic est lié et copier ces fichiers .so dans le même répertoire de l’exécutable dynamic, et les placer sur Ubuntu pour qu’ils s’exécutent. Vous pouvez également placer les fichiers .so dans un autre répertoire et utiliser LD_LIBRARY_PATH pour aider le fichier exécutable à trouver les fichiers .so .