2016-09-23 203 views
3

我想在Code :: Blocks中使用MinGW编译Assimp,但出现以下错误。strncasecmp和strcasecmp尚未声明

\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语句,因为这些函数的名称可能略有不同,但这也没有帮助。

+1

他们不是在标准C头'string.h',因为它们不是标准C功能。 – juanchopanza

+0

您确定,您在代码中包含了“#include ”。 –

+0

您可能正在查看具有这些字符串函数的Msys头文件。 mingw32环境没有这些POSIX函数。 –

回答

1

我正好遇到此完全相同的问题,以及谷歌搜索的解决方案在这个问题上来了,所以我会记录我在这里不可靠的解决方案:

在我得到了它通过使多会刚刚结束对Assimp源代码的小编辑。解决字符串问题不足以让它工作,因为它在构建中稍后会失败。我将列出我在下面所做的编辑。我建议一次制作一个,然后重新构建,以防出于某种原因与您的设置,其中一些不是必需的。请注意,如果您确实需要您必须找出解决链接错误的其他方法,则无法使用此解决方案进行模型导出,因为上次编辑(至Exporter.cpp)。

这不是一个干净的解决方案,它可能会被未来版本的Assimp取代,在这一点上,我将删除它。这是assimp-3.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

接下来,它抛出了一个关于::_fullpathDefaultIOSystem.cpp错误。我的“修复”,这只是使用注释掉的一切其他在此功能的后备选项:

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 setttings因为我禁用几乎所有模型格式)。我固定它通过注释掉的gExporters的定义以及与此替换它:

Exporter::ExportFormatEntry* gExporters = 0; 

此之后,它建立并运行良好。库文件被放置在code文件夹中。将libassimp.dll.a放在lib构建路径和libassimp中。在你的可执行文件的路径中。当然,你也可以通过使用VisualStudio来代替它(我没有,因为我不能打扰它的安装),或者通过在Linux上构建(我之前做过,它先构建好了,但是,我需要做一个Windows端口)。

0

我也有一些问题,但希望我能解决它们。我知道这可能已经太迟了,尤其是在帮助中,但我希望互联网上的人会觉得这很有用。我使用gcc 5.3.0编译Code :: Blocks 16.01。

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

你必须包括并删除在此范围内没有宣布 “::”

:: _ FULLPATH:

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

应该可以正常工作,得到完整路径和错误检查保存得。

vsnprintf在此范围内没有声明

只是在函数名称前加上一个下划线_

to_string不是性病的成员::

我会认为这是使用的MinGW的一些bug,但实际上,Assimp包含一个内置的替代std::to_string。你只需要删除std::部分,它应该滚动。 确保包含在刚删除std::不起作用的文件中。

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

没关系,你已经在“代码”文件夹你的工作的.dll)