Strncasecmp和strcasecmp没有被声明

strncasecmp and strcasecmp has not been declared

本文关键字:声明 strcasecmp Strncasecmp      更新时间:2023-10-16

我试图在Code::Blocks中编译Assimp与MinGW,但我得到以下错误。

assimp-3.3.1assimp-3.3.1codeStringComparison.h||In function 'int Assimp::ASSIMP_stricmp(const char*, const char*)':|
assimp-3.3.1assimp-3.3.1codeStringComparison.h|144|error: '::strcasecmp' has not been declared|
assimp-3.3.1assimp-3.3.1codeStringComparison.h||In function 'int Assimp::ASSIMP_strincmp(const char*, const char*, unsigned int)':|
assimp-3.3.1assimp-3.3.1codeStringComparison.h|193|error: '::strncasecmp' has not been declared|

在搜索时,我发现有问题的两个函数(strcasecmp和strncasecmp)实际上是在string.h中声明的,它包含在StringComparison.h的头中。我也设法得到strings.h,他们原来属于的文件,但包括没有解决的问题。

在搜索这个网站时,我发现我不是唯一一个在这个问题上挣扎的人。我发现的另一个解决方案建议使用define语句,因为函数可能有稍微不同的名称,但这也没有帮助。

我刚刚遇到了完全相同的问题,这个问题是在谷歌搜索解决方案时出现的,所以我将在这里记录我的解决方案:

最后,我通过对Assimp源代码进行多次小编辑,使其运行起来。解决字符串问题并不足以使其工作,因为它只会在构建的后期失败。我将在下面列出我所做的编辑。我建议一次制作一个,然后重新构建,以防万一由于某种原因,您的设置不需要它们中的一些。请注意,您不能使用此解决方案进行模型导出,因为最后一次编辑(到exporters .cpp),如果您真的需要,您将不得不找出另一种方法来修复链接错误。

这不是一个干净的解决方案,它可能会被Assimp的未来版本所取代,届时我将删除它。这是针对assim3.3.1的,使用MinGW:

构建

在StringComparison.h中编辑ASSIMP_stricmp函数,注释除#ifdef:

else子句外的所有内容。
/*#if (defined _MSC_VER)
    return ::_stricmp(s1,s2);
#elif defined( __GNUC__ )
    return ::strcasecmp(s1,s2);
#else*/
    char c1, c2;
    do  {
        c1 = tolower(*s1++);
        c2 = tolower(*s2++);
    }
    while ( c1 && (c1 == c2) );
    return c1 - c2;
//#endif

ASSIMP_strincmp中做类似的事情。

接下来,在DefaultIOSystem.cpp中抛出关于::_fullpath的错误。我对这个问题的"修复"是在这个函数中使用注释掉除回退选项之外的所有内容:

    ai_assert(in && _out);
//    char* ret;
//#if defined( _MSC_VER ) || defined( __MINGW32__ )
//    ret = ::_fullpath( _out, in, PATHLIMIT );
//#else
    // use realpath
//    ret = realpath(in, _out);
//#endif
//    if(!ret) {
        // preserve the input path, maybe someone else is able to fix
        // the path before it is accessed (e.g. our file system filter)
//        DefaultLogger::get()->warn("Invalid path: "+std::string(in));
        strcpy(_out,in);
//    }

它还抱怨snprintf未定义。编辑StringUtils.h将下面的#define更改为在snprintf:

之前添加下划线
#   define ai_snprintf _snprintf

还有一个关于::atof没有定义的错误。您可以通过添加

来解决这个问题。
#include <cstdlib>
对StringUtils.h

这应该得到它的建设,但会有一个链接错误在Exporter.cpp(这可能是由于我的特定CMake设置,因为我禁用了几乎所有的模型格式)。我通过注释gExporters的定义并将其替换为以下内容来修复它:

Exporter::ExportFormatEntry* gExporters = 0;

在此之后,它构建并运行良好。库文件放在code文件夹中。将libassimp.dll.a放在lib构建路径中,将libassimp.dll放在可执行文件路径中。

当然,你也可以通过使用VisualStudio来运行它(我没有,因为我懒得安装它)或通过在Linux上构建(我以前这样做过,它第一次构建得很好,但我需要做一个Windows端口)。

我也有一些问题,但希望我能够解决它们。我知道这可能是太迟了,特别是帮助,但我希望有人在互联网上会发现这有用。我使用Code::Blocks 16.01使用gcc 5.3.0进行编译。

::strncasecmp未在此作用域中声明:

你必须包含并删除"::"

::_fullpath未在此作用域中声明:

我从来没有执行过寻找完整路径的操作,所以这个是我最不确定的。但无论如何,由于我不能简单地删除所有内容,我必须找到替代方案。也就是说,使用"GetFullPathName"。所以,根据MSDN的建议,我加入了,,。我也替换了这一行:ret = _fullpath( _out, in, PATHLIMIT );通过ret = (char*)GetFullPathName(in, PATHLIMIT, _out, NULL);

应该可以正常工作,获取全路径并保持错误检查。

vsnprintf未在此作用域中声明

只需在函数名前加上下划线_

to_string不是std::

我认为这是使用MinGW时常见的错误,但实际上,Assimp包含一个内置的std::to_string替代方案。你只需要删除std::部分,它应该滚动。请确保在文件中包含仅删除std::不起作用的文件。

testCMakeFilesgtest.dirbuild.make|109|recipe for target 'test/gtest/src/gtest-stamp/gtest-build' failed| ?

没关系,你已经有你的工作。dll在"code"文件夹;)

我正在使用Cygwin并遇到相同的错误,使用strncmp和strcmp工作,猜测它与当前为Cygwin实现的库(ANSI c++)或正在使用的项目有关。虽然不确定,只是想让它工作的时刻…