J'essaie de compiler plusieurs logiciels tiers à partir du code source (c'est-à-dire zchaff , argosat ) et d'obtenir des erreurs telles que:
Error: ‘strlen’ was not declared in this scope
Error: ‘strcmp’ was not declared in this scope
Voici le texte du message d'erreur complet (aussi sur Ubuntu Pastebin ):
erelsgl@erel-biu:~/Dropbox/theorem-prover/argosat-1.0$ make
make all-recursive
make[1]: Entering directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0'
Making all in src
make[2]: Entering directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src'
Making all in strategies
make[3]: Entering directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src/strategies'
/bin/bash ../../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I../.. -I../../src -I../../src/auxiliary -I../../src/basic-types -ffloat-store -Wall -Woverloaded-virtual -ansi -pedantic -Wno-strict-aliasing -DNDEBUG -O3 -MT libstrategies_la-RestartStrategy.lo -MD -MP -MF .deps/libstrategies_la-RestartStrategy.Tpo -c -o libstrategies_la-RestartStrategy.lo `test -f 'RestartStrategy.cpp' || echo './'`RestartStrategy.cpp
g++ -DHAVE_CONFIG_H -I. -I../.. -I../../src -I../../src/auxiliary -I../../src/basic-types -ffloat-store -Wall -Woverloaded-virtual -ansi -pedantic -Wno-strict-aliasing -DNDEBUG -O3 -MT libstrategies_la-RestartStrategy.lo -MD -MP -MF .deps/libstrategies_la-RestartStrategy.Tpo -c RestartStrategy.cpp -o libstrategies_la-RestartStrategy.o
In file included from ../../src/SolverListener.hpp:22:0,
from RestartStrategyConflictCounting.hpp:24,
from RestartStrategyMinisat.hpp:22,
from RestartStrategy.cpp:22:
../../src/basic-types/Literal.hpp: In static member function ‘static void ArgoSat::Literals::shuffleVector(std::vector<unsigned int>&)’:
../../src/basic-types/Literal.hpp:83:23: error: ‘Rand’ was not declared in this scope
RestartStrategy.cpp: In static member function ‘static ArgoSat::RestartStrategy* ArgoSat::RestartStrategy::createFromCmdLine(ArgoSat::Solver&, int, char**, int)’:
RestartStrategy.cpp:33:40: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:35:37: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:37:37: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:39:34: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:41:36: error: ‘strcmp’ was not declared in this scope
RestartStrategy.cpp:43:41: error: ‘strcmp’ was not declared in this scope
make[3]: *** [libstrategies_la-RestartStrategy.lo] Error 1
make[3]: Leaving directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src/strategies'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/erelsgl/Dropbox/theorem-prover/argosat-1.0'
make: *** [all] Error 2
erelsgl@erel-biu:~/Dropbox/theorem-prover/argosat-1.0$
J'ai trouvé dans d'autres questions, telles que https://stackoverflow.com/questions/4564850/strlen-was-not-declared-in-this-scope-c , que ces erreurs peuvent être résolues par insérer des instructions "include" dans le code source.
Mais, j'ai téléchargé le code source à partir d'autres sites et je suis presque sûr que cela fonctionne pour eux tel quel. Alors, pourquoi ça ne marche pas pour moi?
(J'ai Ubuntu 12.04.4, g ++ 4.6.3)
Cela semble être le résultat d'un bogue dans le code source du programme (du moins dans le cas spécifique sur lequel vous avez fourni des détails). Mais heureusement, vous pouvez travailler sans trop de problèmes!
Comme il s'agit d'un problème récurrent qui se produit souvent lorsque le code source d'un programme testé sur une autre plate-forme (le plus souvent Windows) est amené à Ubuntu, nous devrions probablement examiner cette question dans les mêmes matières, même si elle implique des bogues et de la programmation. Cela dit, signaler le bogue au développeur du programme est également une action appropriée.
Il semble que l'une des situations suivantes s'applique:
strlen
étaient inclus indirectement par étant entraîné par la mise en oeuvre de un autre fichier d'en-tête . C'est involontairement un comportement spécifique à l'implémentation.strlen
comme identificateurs globaux, même à partir de C++ - style #include
s comme #include <cstring>
. Cela ne fonctionnera pas avec GCC/g ++ sur Ubuntu.Dans les deux cas, vous devrez probablement éditer légèrement le code source, comme le suggère le pointeur Null . Comme cela est assez simple, nous pouvons vous expliquer si vous nous indiquez exactement quels fichiers vous avez téléchargés et quelles étapes, le cas échéant, vous avez suivies avant d’exécuter make
. Vous pouvez modifier votre question pour inclure également ces informations.
Le conseil du pointeur Null d'ajouter quelque chose comme #include <string.h>
en haut des fichiers où les erreurs se produisent fonctionnera probablement . Ce peut être ou ne pas être le meilleur moyen de résoudre ce problème. Si la situation 2 est ce qui se passe, une instruction using
pour les mots-clés nécessaires (ou l'ensemble de l'espace de nom std
si nécessaire) suffirait.