我试图在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语句,因为这些函数的名称可能略有不同,但这两者都没有帮助。
答案 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 ++)有关。不过不确定,只是希望它暂时起作用...