Ошибка: ‘strlen’ не был объявлен в этом объеме

Я пытаюсь скомпилировать несколько стороннего программного обеспечения от исходного кода (т.е. 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),

1
задан 23 May 2017 в 15:39

1 ответ

Это, кажется, результат ошибки в исходном коде программы (по крайней мере, в конкретном случае, о котором вы предоставили подробности). Но, к счастью, это тот, который вы можете обойти без особых проблем!

Поскольку это повторяющаяся проблема, которая часто возникает, когда переносится исходный код для программы, протестированной на другой платформе (чаще всего Windows) для Ubuntu, мы, вероятно, должны рассмотреть этот вопрос по теме, даже если это связано с ошибками и программированием. С учетом сказанного, сообщение об ошибке разработчику программы также является подходящим действием.

Похоже, что применима одна из следующих ситуаций:

  1. Вкл. Платформа (ы), где была разработана и протестирована программа, заголовочный файл (ы), содержащий идентификаторы, подобные strlen, были косвенно включены , будучи вовлеченными реализацией некоторых других заголовочный файл Это непреднамеренное поведение, специфичное для реализации.
  2. Некоторые странные реализации стандартной библиотеки C ++ допускают множество вещей, которые технически запрещены, и некоторые вещи, которые концептуально невозможны. (В общем, это не делает их плохими, обязательно.) Я полагаю, что некоторые версии библиотеки C ++ от Microsoft предоставляют вам функции, подобные strlen, в качестве глобальных идентификаторов даже из стиля C ++ #include, например, #include <cstring>. Это не будет работать с GCC / g ++ в Ubuntu.

В любом случае вам, вероятно, придется немного отредактировать исходный код, , как предложил нулевой указатель . Поскольку это довольно просто, мы можем провести вас через это , если вы точно скажете нам, какие файлы вы скачали и какие шаги, если они были, вы предприняли перед запуском make. Вы можете отредактировать свой вопрос, включив в него и эту информацию.

Совет нулевого указателя добавить что-то вроде #include <string.h> вверху файлов, где происходят ошибки, будет , вероятно, работать. Это может или не может быть лучшим способом исправить это. Если ситуация 2 - это то, что происходит, было бы достаточно оператора using для необходимых ключевых слов (или всего пространства имен std, если необходимо).

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: