错误:‘strlen’未在此范围内声明

错误:‘strlen’未在此范围内声明

我正在尝试从源代码编译几个第三方软件(即查夫阿尔戈萨特) 并出现如下错误:

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,可以通过在源代码中插入“include”语句来解决这些错误。

但是,我从其他网站下载了源代码,我很确定它对他们来说可以正常工作。那么,为什么它对我不起作用呢?

(我有 Ubuntu 12.04.4,g++ 4.6.3)

答案1

这似乎是程序源代码中的错误造成的(至少在您提供详细信息的特定情况下)。但幸运的是,您可以轻松解决这个问题!

由于这是一个反复出现的问题,并且经常发生在将在另一个平台(通常是 Windows)上测试的程序的源代码引入 Ubuntu 时,因此我们应该认为这个问题与主题相关,即使它涉及错误和编程。话虽如此,向程序开发人员报告错误也是适当的做法。

似乎存在下列情况之一:

  1. 在开发和测试程序的平台上,提供如下标识符的头strlen文件间接包括通过实施其他头文件。这是无意中特定于实现的行为。
  2. 一些奇怪的 C++ 标准库实现允许很多技术上被禁止的事情和一些概念上不可能的事情。(这并不一定会使它们整体上变得不好。)我相信微软的某些版本的 C++ 库会为您提供像这样的函数strlen作为全局标识符,即使是来自 C++ 风格的#includes 也是如此#include <cstring>。这在 Ubuntu 上的 GCC/g++ 上不起作用。

无论哪种情况,你都可能需要稍微编辑一下源代码,正如空指针所建议的。由于这很简单,我们可以指导您完成此如果您告诉我们您下载了哪些文件以及在运行之前采取了哪些步骤(如果有)make您可以编辑您的问题以包含此信息。

#include <string.h>空指针的建议是在发生错误的文件顶部添加类似内容可能有效。这可能是也可能不是解决这个问题的最佳方法。如果情况 2 是正在发生的情况,那么using所需关键字的语句(或整个std命名空间,如果需要)就足够了。

相关内容