web-dev-qa-db-fra.com

Erreur: ‘strlen’ n’a pas été déclaré dans cette étendue

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)

1
Erel Segal-Halevi

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:

  1. Sur la ou les plates-formes où le programme a été développé et testé, le ou les fichiers d’en-tête fournissant des identificateurs tels que 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.
  2. Certaines étranges implémentations de bibliothèques standard C++ autorisent de nombreuses choses interdites sur le plan technique et quelques-unes impossibles sur le plan conceptuel. (Cela ne les rend pas nécessairement mauvais en général, nécessairement.) Je pense que certaines versions de la bibliothèque C++ de Microsoft vous offrent des fonctions telles que strlen comme identificateurs globaux, même à partir de C++ - style #includes 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.

1
Eliah Kagan