strncasecmp和strcasecmp尚未声明

时间:2016-09-23 11:10:50

标签: c++ string-comparison assimp

我试图在Code :: Blocks中使用MinGW编译Assimp,但是我收到以下错误。

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

在搜索时我发现有问题的两个函数(strcasecmp和strncasecmp)实际上是在string.h中声明的,它包含在StringComparison.h的标题中。我还设法获得了他们最初所属的文件strings.h,但包括那些也没有解决问题。

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

3 个答案:

答案 0 :(得分:1)

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

最后,我只是对Assimp源代码进行了多次小编辑。解决字符串问题并不足以让它工作,因为它只是在构建后期失败。我将列出我在下面进行的编辑。我建议一次制作一个,然后重建,以防万一你的设置无论如何都不需要它们。请注意,由于上次编辑(对Exporter.cpp),您无法使用此解决方案进行模型导出,如果您确实需要,则必须找出另一种方法来修复链接错误。

它不是一个干净的解决方案,它可能会被未来版本的Assimp取代,此时我将删除它。这是针对使用MinGW构建的assimp-3.3.1:

在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中执行类似的操作。

接下来,它会在::_fullpath中引发有关DefaultIOSystem.cpp的错误。我的#34;修复"对于这个只是在这个函数中使用注释掉其他所有其他回退选项:

    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端口。)

答案 1 :(得分:0)

我也有一些问题,但希望我能够解决它们。我知道这可能为时已晚,无法提供帮助,但我希望互联网上有人会发现这很有用。我使用gcc 5.3.0使用Code :: Blocks 16.01进行编译。

:: strncasecmp未在此范围内声明:

您必须包含并删除&#34; ::&#34;

在此范围内未声明

:: _ fullpath:

我从来没有必要执行找到完整路径的操作,所以这个是我最不确定的那个。但无论如何,因为我不能简单地删除所有内容,所以我必须找到替代方案。也就是说,使用&#34; GetFullPathName&#34;。 所以,正如MSDN所建议的那样,我包括了,。 我也换了一行: ret = _fullpath( _out, in, PATHLIMIT ); 通过 ret = (char*)GetFullPathName(in, PATHLIMIT, _out, NULL);

应该正常工作,获得完整路径并保持错误检查。

vsnprintf未在此范围内声明

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

to_string不是std ::

的成员

我认为这是使用MinGW的常见错误,但实际上,Assimp包含std::to_string的内置替代品。您只需删除std::部分即可滚动。 请确保包含仅删除std::无法正常工作的文件。

test\CMakeFiles\gtest.dir\build.make|109|recipe for target 'test/gtest/src/gtest-stamp/gtest-build' failed|

没关系,你已经在&#34;代码&#34;中使用了你的.dll。文件夹;)

答案 2 :(得分:0)

我在使用Cygwin时遇到了相同的错误,使用strncmp和strcmp起作用,猜测这与当前为Cygwin实现或由您的项目使用的库(ANSI C ++)有关。不过不确定,只是希望它暂时起作用...