Я пытаюсь скомпилировать несколько стороннего программного обеспечения от исходного кода (т.е. zchaff, argosat) и получить ошибки, такие как:
Error: ‘strlen’ was not declared in this scope
Error: ‘strcmp’ was not declared in this scope
Вот полный текст сообщения об ошибке (также на 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$
Я нашел в других вопросах, таких как https://stackoverflow.com/questions/4564850/strlen-was-not-declared-in-this-scope-c, что эти ошибки могут быть решены вставкой, "включают" операторы в исходный код.
Но, я загрузил исходный код с других сайтов, и я вполне уверен, он работает на них, как. Так, почему это не работает на меня?
(У меня есть Ubuntu 12.04.4, g ++ 4.6.3),
Это, кажется, результат ошибки в исходном коде программы (по крайней мере, в конкретном случае, о котором вы предоставили подробности). Но, к счастью, это тот, который вы можете обойти без особых проблем!
Поскольку это повторяющаяся проблема, которая часто возникает, когда переносится исходный код для программы, протестированной на другой платформе (чаще всего Windows) для Ubuntu, мы, вероятно, должны рассмотреть этот вопрос по теме, даже если это связано с ошибками и программированием. С учетом сказанного, сообщение об ошибке разработчику программы также является подходящим действием. Sup>
Похоже, что применима одна из следующих ситуаций:
strlen
, были косвенно включены , будучи вовлеченными реализацией некоторых других заголовочный файл Это непреднамеренное поведение, специфичное для реализации. strlen
, в качестве глобальных идентификаторов даже из стиля C ++ #include
, например, #include <cstring>
. Это не будет работать с GCC / g ++ в Ubuntu. В любом случае вам, вероятно, придется немного отредактировать исходный код, , как предложил нулевой указатель . Поскольку это довольно просто, мы можем провести вас через это , если вы точно скажете нам, какие файлы вы скачали и какие шаги, если они были, вы предприняли перед запуском make
. Вы можете отредактировать свой вопрос, включив в него и эту информацию.
Совет нулевого указателя добавить что-то вроде #include <string.h>
вверху файлов, где происходят ошибки, будет , вероятно, работать. Это может или не может быть лучшим способом исправить это. Если ситуация 2 - это то, что происходит, было бы достаточно оператора using
для необходимых ключевых слов (или всего пространства имен std
, если необходимо).