2

我已经使用 OpenGL 和 glut 有一段时间了,从来没有遇到过这个问题。

我一直在尝试将 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 支持切换到任何不是 clr:safe 或 clr:pure 的东西,类似的问题已经得到解决。

事实上,我已经尝试使用所有 4 个可用版本的 clr 支持进行编译:

公共语言运行时支持 (/clr)

纯 MSIL 公共语言运行时支持 (/clr:pure)

安全 MSIL 公共语言运行时支持 (/clr:safe)

公共语言运行时支持,旧语法 (/clr:oldSyntax)

但是我仍然收到相同的错误消息。我不知道这个问题来自哪里。我在其他项目中使用过 glut(仅限 c++),在我开始使用 c++/cli 之前从未遇到过这个问题。

任何洞察这可能是什么将不胜感激。

提前致谢,

盖伊

(顺便说一句,如果结果证明有任何相关性,我正在使用 Visual Studio 2010。)

4

2 回答 2

2

/clr如果用于编译文件,则不会出现您显示的错误消息,仅/clr:pure/clr:safe.

您绝对需要使用/clr,而不是使用/clr:pureor /clr:safe,因为后面的标志根本不允许您在 .cpp 文件中使用本机代码。确保您没有覆盖项目设置的单个文件/clr,因为这可能会导致编译器创建错误,例如您为这些文件显示的错误。

于 2013-06-24T17:18:27.900 回答
1

您需要让编译器知道 glut.h 是非托管代码的标头。如果它不知道,那么它将假定它包含托管函数并且它不喜欢它所看到的。你这样做:

#pragma managed(push, off)
#include <gl/glut.h>
#pragma managed(pop)

避免此类麻烦的更通用方法是将 C++/CLI 代码与本机代码严格分开。您可以为单个源文件打开 /clr 选项,不需要为项目中的每个源代码文件都打开它。这也有助于将本机代码编译为机器代码而不是 IL,这样会更快。

于 2013-06-24T17:34:06.977 回答