好的,所以我最近有了OpenGL SuperBible,并在 Code::: Block上将目录设置为freeglutGLTools.h,但是这些#include语句不起作用:

#include <GLtools.h>
#include <GLShaderManager.h>
#include <iostream>
#include <GL/glut.h>

要设置目录,我通过“设置”->“编译器和调试器...”->“搜索目录”选项卡,并将其添加到“编译器”选项卡下(还有“链接器”和“资源编译器”选项卡):
C:\CodeBlocks\SB5\Src\GLTools\include


C:\CodeBlocks\SB5\freeglut-2.6.0\include

这些是我得到的错误:
C:\CodeBlocks\SB5\freeglut-2.6.0\include\GL\freeglut_std.h|60|warning: "NOMINMAX" redefined|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\mingw32\bits\os_defines.h|46|warning: this is the location of the previous definition|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|225|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|226|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|227|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|228|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|229|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|230|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|231|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|232|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|233|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|234|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|235|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|236|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|237|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|238|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|239|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|240|error: expected constructor, destructor, or type conversion before 'const'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|241|error: expected constructor, destructor, or type conversion before 'const'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|242|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|243|error: expected constructor, destructor, or type conversion before 'const'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|244|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|245|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|246|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|247|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|248|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|249|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|250|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|251|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|252|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|253|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|254|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|255|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|256|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|257|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|258|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|259|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|260|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|261|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|262|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|263|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|264|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|265|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|266|error: 'GLAPI' does not name a type|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|267|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|268|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|269|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|270|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|271|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|272|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|273|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|274|error: expected constructor, destructor, or type conversion before 'void'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 2 warnings ===|

头文件之间似乎发生了某种冲突,尽管当我什至不包含glu.h时,头文件中都出现了错误。

请帮忙!和谢谢! =)

最佳答案

当您尝试在SuperBible(第5版)中编译Triangle示例时,我遇到了与您同样的问题。我还喜欢在MinGW中使用Code::Blocks。我一直在做一些研究,我认为我已经设法解决了大多数问题。

首先要做的是正确设置我们的环境。我们从配置库freeglut和GLTools开始。

在开始之前,请确保已安装最新版本的MinGW和MSYS。检查是否已将c:/MinGW/bin添加到路径变量。还可以使用7z这样的优质文件提取器,它可以解压缩.tar和.gz文件。

我可能会太详细了,但是直到我研究了这些东西,这些东西对我来说都是不明显的。

要设置freeglut-2.6.0,我们要做的第一件事是从源代码编译静态库:

  • 转到freeglut's网站并下载最新版本(当前为2.6.0)
  • 创建一个c:/libs目录,然后在其中解压缩freeglut软件包。您应该以名为c:/libs/freeglut-2.6.0的目录结尾。
  • 运行MSYS(c:/MinGW/msys/1.0/msys.bat)。您应该位于主目录中(在用户和主机所在的顶行之后,用〜表示)。
  • 键入“cd/c/libs/freeglut-2.6.0/src”,然后按[enter]。 〜将更改为/c/libs/freeglut-2.6.0/src以表示您当前的工作目录。
  • 键入“gcc -O2 -c -DFREEGLUT_STATIC * .c -I ../include”,然后按[enter]。我们在这里的工作是调用gcc编译器,指示它使用O2优化,设置标志FREEGLUT_STATIC,并将此目录中的每个源文件编译为.o目标文件,并在“../include”中查找 header 。这就意味着要下降一个级别(到/c/libs/freeglut-2.6.0),然后在该目录中查找/include目录。
  • 键入“ar rcs libfreeglut32_static.a * .o”,然后按Enter。据我所知,ar是用于编译静态库,存档文件(.a)的实用程序。我们告诉它从上一步中刚刚编译的每个目标文件(.o)中创建“libfreeglut32_static.a”。
  • 在/c/libs/freeglut-2.6.0中创建一个/lib目录。然后剪切我们刚刚创建的库,并将其粘贴到此目录中。 freeglut库的最终位置应为“c:/libs/freeglut-2.6.0/lib/libfreeglut32_static.a”。

  • 转到this site以获得有关使用MinGW编译freeglut的更多引用。

    在使GLTools工作之前,请确保freeglut可以工作。
  • 打开Code::Blocks,然后关闭所有打开的项目。转到“设置->编译器和调试器”,然后打开“搜索目录”标签。在编译器中,添加目录“c:/libs/freeglut-2.6.0/include/”。在链接器中,添加“c:/libs/freeglut-2.6.0/lib/”。
  • 创建一个空项目。添加一个test.cpp文件。添加单个函数int main (){return 0;}
  • 它应该没有问题。
  • 添加#define FREEGLUT_STATIC#include <GL/glut.h>
  • 尝试编译。它会失败。
  • 右键单击项目,然后转到“构建选项”。确保您正在编辑整个项目的选项,而不是“调试”或“发布”目标。移至链接器选项卡,然后将其添加到链接库“freeglut32_static”。
  • 尝试编译。它将再次失败。编译器将抛出“ undefined reference ”错误,列出了许多函数。复制第一个的名称,然后在google中查找。转到microsoft搜索结果(第一个或第二个结果)。它将描述函数,更重要的是,告诉您该函数在哪个库中。
  • 该库将称为“something.lib”。再次转到“构建选项”,然后向链接库添加“内容”。
  • 尝试再次编译。它将再次失败。如果您不愿意检查,您会发现第一个“ undefined reference ”已更改。重复7和8,直到停止失败。要使Freeglut工作,您必须添加的其他库是“Winmm”,“Gdi32”和“Opengl32”。
  • 再次编译。应该创建test.exe。耶!

  • 好的,既然我们已经有了freeglut,现在该再次打破它了。我们首先将重新创建GLTools库,因为SB5仅分发.lib版本。
  • SB5下载应具有4个主要目录;请参见引用资料。 freeglut,linux,visualstudio和src。进入src。复制GLTools目录,并将其粘贴到“c:/libs”中。
  • 在GLTools中创建一个lib目录。现在其中应包含三个目录,分别是/include,/src和/lib。
  • 再次启动MSYS。键入“cd/c/libs/GLTools/src”,然后按[输入]。
  • 就像处理freeglut一样,我们将获取所有工具的代码并将其链接到单个库中。键入“g++ -c * .cpp -I ../include”,然后按[enter],然后按“ar rcs libGLTools.a * .o”。
  • 将输出libGLTools.a剪切为“c:/libs/GLTools/lib”。
  • 我们也这样做。键入“g++ -c glew.c -I ../include”,然后输入[enter]。然后是“ar rcs libglew.a glew.o”。
  • 在Code::Blocks中,返回“设置->编译器和调试器”并打开“搜索目录”选项卡。在编译器中,添加目录“c:/libs/GLTools/include/”。在链接器中,添加“c:/libs/GLTools/lib/”。
  • 我保证我们会打破以前做过的事情,不是吗?将添加到我们的测试程序#include <GLTools.h>并尝试构建该项目。您应该遇到许多“'GLAPI'未命名类型”错误。之所以发生这种情况,是因为在某些时候(不确定自己在哪里)GLAPI尚未定义。或定义错误。

  • 如果您从未使用过这种库(我还没有,所以对我来说也是一种学习经验),那么这值得调查。当我们包含“glut.h”时,如果打开头文件,您将看到它只是包含“freeglut_std.h”。因此,您打开该文件,它具有许多预处理程序命令。

    在文档中搜索GLAPI,我们发现这里没有定义GLAPI。但是,它确实包括<GL/gl.h><GL/glu.h>。因此,打开gl.h并在那里进行搜索。

    答对了!我们可以看到一些与GLAPI定义相关的命令。这有点令人困惑,但是我们将复制预处理器通常执行的操作。所以我们有这些行:
    /* GLAPI, part 1 (use WINGDIAPI, if defined) */
    #if defined(__WIN32__) && defined(WINGDIAPI)
    #  define GLAPI WINGDIAPI
    #endif
    
    /* GLAPI, part 2 */
    #if !defined(GLAPI)
    #  if defined(_MSC_VER)                        /* Microsoft Visual C++ */
    #    define GLAPI __declspec(dllimport)
    #  elif defined(__LCC__) && defined(__WIN32__) /* LCC-Win32 */
    #    define GLAPI __stdcall
    #  else                                        /* Others (e.g. MinGW, Cygwin, non-win32) */
    #    define GLAPI extern
    #  endif
    #endif
    

    我们可以搜索freeglut_std.h并找出未定义的WINGDIAPI。因此,我们跳过第一个块。从第二个块中,我们可以看到所需的行是#define GLAPI extern

    那么,似乎正在发生的事情是GLTools中的头文件之一正在为我们弄乱这个定义。没什么可做的,只是尝试找出问题所在。

    GLTools没有说任何关于GLAPI的信息,但是在<windows.h>之前包括<GL/glew.h><GL/gl.h>。 glew.h定义了GLAPI几次,但是因为代码中没有标识,所以分辨输入或不输入代码有点令人困惑。但是,很明显,出于我们的目的,必须将GLAPI定义为extern。因此,我们将对test.cpp进行快速修改,并将GLAPI定义为extern,该命令位于include之前。
    #include <GLTools.h>
    
    #define FREEGLUT_STATIC
    #define GLAPI extern
    #include <GL/glut.h>
    

    它仍然会被破坏,但是我们应该得到一个退出的新错误!因此,我们编译并...

    嗯它编译没有错误。那不应该发生的。但是,然后,我们没有调用GLTools中的任何函数,因此也许并不奇怪。我们会碰运气,然后在triangle.ccp,#include <GLShaderManager.h>中添加第二个include。并编译,再次没有错误。

    好的,所以我们几乎可以构建示例了。现在,我们开始用triangle.cpp的内容填充test.cpp,并在失败时进行测试。我先添加
    GLBatch triangleBatch;
    GLShaderManager shaderManager;
    

    在main之外,还有几个 undefined reference 。这还差不多。因此,我们打开Build选项(记住要指定整个项目,而不是发行或调试目标),并将GLTools添加到Link库。我们这样做了,现在(正如您应该一直注意的那样,您应该期待),我们得到了一堆对glew函数的 undefined reference 。

    e!如此令人兴奋。因此,现在我们将glew库添加到Build选项。如果您最后链接有问题,我们会学到一些新知识。您必须记住,在链接库时,必须先链接具有自己的依赖关系的库。如果我们提前知道它们都依赖什么,这将很有帮助,因此将来可以绘制 map 或其他内容。

    因此,我们要链接freeglut,这取决于winmm,gdi32和opengl32。我们还希望依赖于glew的GLTools和依赖opengl32的glew。然后,将它们链接的顺序应该是... freeglut,GLTools,glew,winmm,gdi32和opengl32。让我们看看是否可行...。

    哈!它编译没有错误。该死的我很好(不是真的:()。

    好的,既然我们已经设置了环境,我就将Triangle.cpp文件的其余部分复制过来,保存,构建,并且没有错误。

    我已经在两台计算机上测试了这些步骤,并且它们起作用了。我认为以上步骤应该使使用Code::Blocks和MinGW的任何人都可以在OpenGL SuperBible,第5版中构建教程。

    关于c++ - OpenGL SuperBible 5版设置问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5608520/

    10-11 19:03