c ++构建错误

时间:2012-11-28 09:34:00

标签: c++

我正在尝试将wwise集成到测试项目中。我使用ms visual studio 2010在Windows 7上有一个项目,这是我尝试添加一个necassary cpp到项目后得到的错误。我在家里的机器上使用相同的设置不会出现这个构建错误,这是什么意思?

------ Build started: Project: wwise test, Configuration: Debug Win32 ------
  AkFilePackageLUT.cpp
c:\program files (x86)\audiokinetic\wwise v2012.2.1 build 4427\sdk\samples\soundengine\common\akfilepackagelut.h(204): error C2065: 'NULL' : undeclared identifier
      c:\program files (x86)\audiokinetic\wwise v2012.2.1 build 4427\sdk\samples\soundengine\common\akfilepackagelut.cpp(117) : see reference to function template instantiation 'const CAkFilePackageLUT::AkFileEntry<T_FILEID> *CAkFilePackageLUT::LookupFile<AkFileID>(T_FILEID,const CAkFilePackageLUT::FileLUT<T_FILEID> *,bool)' being compiled
      with
      [
          T_FILEID=AkFileID
      ]
c:\program files (x86)\audiokinetic\wwise v2012.2.1 build 4427\sdk\samples\soundengine\common\akfilepackagelut.h(204): error C2065: 'NULL' : undeclared identifier
      c:\program files (x86)\audiokinetic\wwise v2012.2.1 build 4427\sdk\samples\soundengine\common\akfilepackagelut.cpp(140) : see reference to function template instantiation 'const CAkFilePackageLUT::AkFileEntry<T_FILEID> *CAkFilePackageLUT::LookupFile<AkUInt64>(T_FILEID,const CAkFilePackageLUT::FileLUT<T_FILEID> *,bool)' being compiled
      with
      [
          T_FILEID=AkUInt64
      ]

2 个答案:

答案 0 :(得分:1)

对我来说,第一眼看上去就像你没有指定模板参数一样。

其他可能的原因:

  • 您正在使用C运行时的调试版进行编译,声明了一个 标准C ++库迭代器变量在for循环中,然后 试图在for的范围之外使用那个迭代器变量 环。使用调试版本编译标准C ++库代码 C运行时意味着/ Zc:forScope。请参阅Debug Iterator支持 更多信息。

  • 您可能正在调用SDK头文件中的函数 目前在您的构建环境中不受支持。

  • 省略必要的包含文件,尤其是在您定义的情况下    VC_EXTRALEAN,WIN32_LEAN_AND_MEAN或WIN32_EXTRA_LEAN。这些    符号从windows.h和afxv_w32.h中删除一些头文件    速度编译。 (查看windows.h和afxv_w32.h以获取最新信息    什么被排除在外的描述。)

  • 标识符名称拼写错误。

  • 标识符使用错误的大写和小写字母。

  • 字符串常量后缺少结束语。

  • 不正确的命名空间范围。解析ANSI C ++标准库    例如,函数和运算符必须指定std    带有using指令的命名空间。以下示例未通过    编译,因为using指令被注释掉,而cout是    在std名称空间中定义

答案 1 :(得分:1)

此错误消息说明如下:

<{1>} <path...>\akfilepackagelut.h中有一个函数模板的定义。事实上,它是一个模板化的方法。在该定义内,在第204行,使用名称NULLNULL在C标准库的标头<cstddef>中定义,通常您可以通过包含许多C / C ++标头中的一个来包含该定义,因为它们中的大部分以某种方式包含<cstddef> 。但是,akfilepackagelut.h似乎只包含您正在使用的VS2012安装中的标题 not 包含该定义,因此编译器不知道NULL的含义。

错误消息的其余部分只是模板错误乱码,告诉你我们正在谈论的那个函数模板已经在AkFilePackageLUT.cpp的某个地方实例化了两次,告诉你确切的位置和模板参数等等。

你能做什么? 好吧,如果你不能像你说的那样修改源代码(为什么?你拥有源代码)你不能做任何事情,但可能会为项目提交一个bug。如果您可以修改它,最好#include <cstddef>中的akfilepackagelut.h