Strncasecmp和strcasecmp没有被声明
strncasecmp and strcasecmp has not been declared
我试图在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++)或正在使用的项目有关。虽然不确定,只是想让它工作的时刻…
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- Strncasecmp和strcasecmp没有被声明
- ' strcasecmp '没有在这个作用域中声明