我刚刚遇到了这个完全相同的问题,这个问题是在谷歌搜索解决方案时出现的,所以我将在这里记录我的狡猾的解决方案:
最后,我通过对 Assimp 源代码进行多次小修改就成功了。解决字符串问题不足以使其正常工作,因为它在构建的后期会失败。我将在下面列出我所做的编辑。我建议一次制作一个,然后重建,以防万一您的设置出于某种原因不需要其中一些。请注意,由于最后一次编辑(对 Exporter.cpp),您无法使用此解决方案进行模型导出,如果您确实需要,则必须找出另一种方法来修复链接错误。
这不是一个干净的解决方案,它可能会被 Assimp 的未来版本取代,届时我将删除它。这是针对 assimp-3.3.1,使用 MinGW 构建的:
在 StringComparison.h 中,编辑ASSIMP_stricmp
函数,注释掉除else
#ifdef 子句:
/*#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
in DefaultIOSystem.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 设置造成的,因为我禁用了几乎所有模型格式)。我通过注释掉定义来修复它gExporters
并将其替换为:
Exporter::ExportFormatEntry* gExporters = 0;
此后它构建并运行良好。库文件放置在code
文件夹。将 libassimp.dll.a 放在 lib 构建路径中,将 libassimp.dll 放在可执行文件的路径中。
当然,您也可以通过使用 VisualStudio 来实现它(我没有这样做,因为我懒得安装它)或在 Linux 上构建(我之前这样做过,并且第一次构建得很好,但我需要这样做Windows 端口)。