"strcasecmp"在此范围内未声明

4

我正在尝试构建一个名为lipiTk的源代码

我遇到了很多类似这样的错误:

Documents/lipi/lipi/src/reco/shaperec/activedtw/ActiveDTWShapeRecognizer.cpp:1222:78: 
 error: ‘strcasecmp’ was not declared in this scope

我应该怎么做,代码中有太多类似错误的cpp文件。

我不认为通过在每个出错的cpp文件中写入include string.h来进行测试是可行的,问题可能与我的编译器有关吗?

我使用的是Ubuntu,并且GCC版本为4.5。

从手册上看,我的软件配置比lipitk所需的要高。


1
你尝试过构建一个仅包含此函数的小程序来确保你的编译器配置正确吗? - Ed Heal
听起来像是一个命名空间问题。 - Sean Bright
你不需要对每个文件进行测试。只需在编译器抱怨的第一个文件上进行测试。如果该文件的错误消失了,那么修复其他文件。否则,尝试其他方法(例如检查文档,文档会告诉你函数声明在哪里)。 - Rob Kennedy
4个回答

13

我认为它可能正在执行某些操作

#include <string>
如果您将其更改为正确的形式,则错误应该会被修复。
#include <strings.h>

10

这里我猜测一下。"strcasecmp"不是标准库函数,但它的命名遵循库函数的约定,所以我想lipiTk最初是使用某个编译器编写的,该编译器在其运行时库中添加了许多非标准扩展(并在标准头文件中声明了它们)。

所以,我猜问题在于你的编译器具有不同的库扩展集--或者可能是名称不同的类似扩展--Google告诉我"strcasecmp"执行大小写不敏感的字符串比较,而许多编译器称之为"stricmp"、"strcmpi"或"_stricmp"。找出你的编译器使用哪个名称,然后在源文件顶部添加一个#define:

#define strcasecmp _stricmp

1
没错,strcasecmp不在C或C++标准中定义。然而,它是由POSIX.1-2001和4.4BSD定义的。 - jweyrich

7

如我之前评论中所提到的,strcasecmp不是C或C++标准中定义的函数。然而,它由POSIX.1-2001和4.4BSD定义。

假设你的系统符合POSIX或BSD标准,你必须包含正确的头文件:

#include <strings.h>

1

您需要包含文件才能使函数在作用域中可用 - 如果您无法在每个文件中正确地包含它(我假设它很多),那么您是如何获得这么多代码的呢?

附注:您确定您的Ubuntu版本中string.h有该函数可用吗?请键入:

man strcasecmp

在 bash 终端中输入来查看它是否存在以及如何访问它。假设你的代码正确且包含只是从移植或类似情况中离线,这可能会帮助你找到它所在的位置。


在使用GCC 4.5的Ubuntu上,“man 3 strcasecmp | head -9 | tail -1”命令显示应该包含“<strings.h>”头文件。(注意“s”,但我不确定这是否只是原帖中的拼写错误) - user786653
是的,当我谷歌搜索时,我也找到了strings.h(我没有ubuntu来检查它)。因此,我想他的情况可能也是如此。也许如果他添加它会有所帮助 :) - John Humphreys
我意识到 :) 顺便提一下,在(我的)Ubuntu上,string.h确实定义了strcasecmp,但仅当-std=c99未激活或__USE_BSD被定义时。 - user786653
微软Visual Studio 2019需要名称_strcmpi。 - A Fog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接