我一直在使用OpenGL,而且从未遇到过这个问题。
我一直在尝试将glut库包含在我的c ++ / cli项目中,以便使用它的库函数,如glutMouseFunc等。我的项目已经使用了gl.h和glu.h.但是,当我包括:
#include <gl/glut.h>
我收到以下错误消息字符串。
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(490): error C3641: 'glutInit_ATEXIT_HACK' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(490): error C2664: '__glutInitWithExit' : cannot convert parameter 3 from 'void (__cdecl *)(int)' to 'void (__cdecl *)(int)'
1> Address of a function yields __clrcall calling convention in /clr:pure and /clr:safe; consider using __clrcall in target type
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(507): error C3641: 'glutCreateWindow_ATEXIT_HACK' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(507): error C2664: '__glutCreateWindowWithExit' : cannot convert parameter 2 from 'void (__cdecl *)(int)' to 'void (__cdecl *)(int)'
1> Address of a function yields __clrcall calling convention in /clr:pure and /clr:safe; consider using __clrcall in target type
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(553): error C3641: 'glutCreateMenu_ATEXIT_HACK' : invalid calling convention '__stdcall ' for function compiled with /clr:pure or /clr:safe
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl/glut.h(553): error C2664: '__glutCreateMenuWithExit' : cannot convert parameter 2 from 'void (__cdecl *)(int)' to 'void (__cdecl *)(int)'
1> Address of a function yields __clrcall calling convention in /clr:pure and /clr:safe; consider using __clrcall in target type
我已经在其他一些地方读过,通过将项目属性中的clr支持(属性&gt;配置属性&gt;一般&gt;公共语言运行时支持)切换到非clr:safe或clr的任何内容,解决了类似的问题:纯。
我实际上尝试使用所有4种可用版本的clr支持进行编译:
公共语言运行时支持(/ clr)
纯MSIL公共语言运行时支持(/ clr:pure)
安全的MSIL公共语言运行时支持(/ clr:安全)
公共语言运行时支持,旧语法(/ clr:oldSyntax)
但是我仍然收到相同的错误消息。我不知道这个问题来自哪里。我在其他项目中使用过剩(仅限c ++),在我开始使用c ++ / cli之前从未遇到过这个问题。
非常感谢任何有关这一点的见解。
提前致谢,
盖
(顺便说一句,如果它与任何相关性,我正在使用Visual Studio 2010。)
答案 0 :(得分:2)
如果使用/clr
编译文件,只会/clr:pure
或/clr:safe
,则不会显示您正在显示的错误消息。
您肯定需要使用/clr
,而不是使用/clr:pure
或/clr:safe
,因为后面的标志将不允许您在.cpp文件中使用本机代码。确保没有一个文件覆盖/clr
的项目设置,因为这可能导致编译器创建错误,例如您正在显示这些文件。
答案 1 :(得分:1)
您需要让编译器知道glut.h是非托管代码的标头。如果它不知道那么它将假设它包含托管函数并且它不喜欢它看到的内容。你这样做:
#pragma managed(push, off)
#include <gl/glut.h>
#pragma managed(pop)
更加通用的方法是通过严格地将C ++ / CLI代码与本机代码分开来避免麻烦。您可以为各个源文件打开/ clr选项,不需要为项目中的每个源代码文件打开它。这也有助于将本机代码编译为机器代码而不是IL,这种方式更快。</ p>