C++ cli 将glut库与C++/CLI

C++ cli 将glut库与C++/CLI,c++-cli,glut,C++ Cli,Glut,我已经在glut中使用OpenGL很长一段时间了,从来没有遇到过这个问题 我一直试图在我的c++/cli项目中包含glut库,以便使用它的库函数,如glutMouseFunc等。我的项目已经使用了gl.h和glu.h。然而,我现在包括: #include <gl/glut.h> 我在其他一些地方读到过,类似的问题已经通过将项目属性(属性>配置属性>常规>公共语言运行时支持)中的clr支持切换到任何不是clr:safe或clr:pure的东西来解决 事实上,我已经尝试使用clr支持的

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

我一直试图在我的c++/cli项目中包含glut库,以便使用它的库函数,如glutMouseFunc等。我的项目已经使用了gl.h和glu.h。然而,我现在包括:

#include <gl/glut.h>
我在其他一些地方读到过,类似的问题已经通过将项目属性(属性>配置属性>常规>公共语言运行时支持)中的clr支持切换到任何不是clr:safe或clr:pure的东西来解决

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

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

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

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

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

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

如果您能深入了解这一点,我们将不胜感激

提前感谢,

家伙


(顺便说一句,我正在使用Visual Studio 2010,如果它被证明是相关的。)

如果使用
/clr
编译文件,则不会显示错误消息,仅
/clr:pure
/clr:safe


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

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

#pragma managed(push, off)
#include <gl/glut.h>
#pragma managed(pop)
#pragma管理(推、关)
#包括
#布拉格语管理(pop)

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

感谢您的回复。请举例说明“覆盖项目设置”的含义。据我所知,除了在Visual Studio中,我没有在其他任何地方更改项目设置。@GuyJoelMcLean您可以将
/clr
设置指定为特定.cpp文件以及项目的属性。文件的属性将“覆盖”项目设置(因此项目可以是
/clr
,但特定的.cpp文件可以设置为
/clr:pure
),我们将看到这非常奇怪。我没有完成并检查项目的构建配置(包括“调试”和“发布”)。如果选择“所有配置”,VS2010将向您说明配置之间的不同设置。2之间唯一的区别是“附加依赖项”,调试配置包含opengl32.lib、glut.lib和glu32.lib,我忘了复制到发布配置。所以我把它们复制到发布配置中,然后使用“release”进行编译。它现在编译得很好。你很可能是对的……我可能不小心在调试配置中为单个文件切换了clr支持。然而,我不会在发布配置上这样做,因为我一直在调试中工作,直到现在。这就解释了为什么它现在可以发布。谢谢你的帮助。
#pragma managed(push, off)
#include <gl/glut.h>
#pragma managed(pop)