在 linux 终端上使用 c++ 编译示例 opengl 应用程序

Posted

技术标签:

【中文标题】在 linux 终端上使用 c++ 编译示例 opengl 应用程序【英文标题】:Compiling example opengl application using c++ on linux terminal 【发布时间】:2017-02-23 12:52:51 【问题描述】:

所以,由于标题几乎解释了一切,让我来说明为什么这对我不起作用。

我有一个简单的 OpenGL 应用程序,我应该使用 GLFW 库来编译和运行它。 到目前为止一切顺利,我已经下载并测试了所有 OpenGL 和 GLFW 库,以及 GLUT 等其他库。 通过终端编译应用程序时,我也像这样链接所需的库(我不确定需要哪些库,这就是为什么我在没有专业知识的情况下放了一堆):

g++ -std=gnu++11 -lglut -lGL -lGLU -lGLEW -lglfw3 -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread main.cpp -o main -I external/include/

让我分享一下ls 在该项目目录中显示的内容:

external    gl_app.hpp       main.cpp    models.hpp
gl_app.cpp  gl_includes.hpp  models.cpp  Readme.md

文件夹external 包含一些包含在main.cpp 文件中的标头。这就是为什么我也调用这个文件夹。

这是main.cpp 的前十行。 "glm/*.hpp" 文件位于 external 文件夹中。

#include "gl_app.hpp"
#include "models.hpp"

#include <glm/vec2.hpp>
#include <glm/mat4x4.hpp>
#include <glm/gtc/matrix_transform.hpp>

#include <iostream>
#include <memory>
#include <cmath>

毕竟,这是我收到的错误消息。它只是抱怨声明。我已经阅读了许多文档和问题,实施了许多面临非常相似问题的解决方案。但就我而言,问题仍然存在。

有什么帮助吗?

main.cpp: In member function ‘virtual bool gl_ifi::GlExample::init()’:

main.cpp:78:54: error: ‘glViewport’ was not declared in this scope
         glViewport(0, 0, int(fbSize.x), int(fbSize.y));
                                                      ^
main.cpp:87:53: error: ‘glCreateShader’ was not declared in this scope
         vertShader = glCreateShader(GL_VERTEX_SHADER);
                                                     ^
main.cpp:88:59: error: ‘glShaderSource’ was not declared in this scope
         glShaderSource(vertShader, 1, &vertShaderSource, 0);
                                                           ^
main.cpp:89:35: error: ‘glCompileShader’ was not declared in this scope
         glCompileShader(vertShader);
                                   ^
main.cpp:90:61: error: ‘glGetShaderiv’ was not declared in this scope
         glGetShaderiv(vertShader, GL_COMPILE_STATUS, &status);
                                                             ^
main.cpp:93:64: error: ‘glGetShaderInfoLog’ was not declared in this scope
             glGetShaderInfoLog(vertShader, 512, 0, errorMessage);
                                                                ^
main.cpp:106:64: error: ‘glGetShaderInfoLog’ was not declared in this scope
             glGetShaderInfoLog(fragShader, 512, 0, errorMessage);
                                                                ^
main.cpp:113:36: error: ‘glCreateProgram’ was not declared in this scope
         program_ = glCreateProgram();
                                    ^
main.cpp:115:44: error: ‘glAttachShader’ was not declared in this scope
         glAttachShader(program_, vertShader);
                                            ^
main.cpp:117:31: error: ‘glLinkProgram’ was not declared in this scope
         glLinkProgram(program_);
                               ^
main.cpp:118:57: error: ‘glGetProgramiv’ was not declared in this scope
         glGetProgramiv(program_, GL_LINK_STATUS, &status);
                                                         ^
main.cpp:120:63: error: ‘glGetProgramInfoLog’ was not declared in this scope
             glGetProgramInfoLog(program_, 512, 0, errorMessage);
                                                               ^
main.cpp:125:34: error: ‘glDeleteShader’ was not declared in this scope
         glDeleteShader(vertShader);
                                  ^
main.cpp:129:65: error: ‘glGetUniformLocation’ was not declared in this scope
         uniformMVP_ = glGetUniformLocation(program_, "mvpMatrix");
                                                                 ^
main.cpp: In member function ‘virtual bool gl_ifi::GlExample::render()’:
main.cpp:137:31: error: ‘glEnable’ was not declared in this scope
         glEnable(GL_DEPTH_TEST);
                               ^
main.cpp:138:31: error: ‘glDisable’ was not declared in this scope
         glDisable(GL_CULL_FACE);
                               ^
main.cpp:141:44: error: ‘glClearColor’ was not declared in this scope
         glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
                                            ^
main.cpp:142:58: error: ‘glClear’ was not declared in this scope
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                                                          ^
main.cpp:145:30: error: ‘glUseProgram’ was not declared in this scope
         glUseProgram(program_);
                              ^
main.cpp:149:71: error: ‘glUniformMatrix4fv’ was not declared in this scope
     glUniformMatrix4fv(uniformMVP_, 1, GL_FALSE, &mvpMatrix_[0][0]);
                                                                   ^
main.cpp:151:52: error: ‘glBindVertexArray’ was not declared in this scope
         glBindVertexArray(cube_->getVertexArrayId());
                                                    ^
main.cpp:153:42: error: ‘glDrawElements’ was not declared in this scope
                        GL_UNSIGNED_INT, 0);
                                          ^
main.cpp: In member function ‘virtual bool gl_ifi::GlExample::end()’:
main.cpp:163:37: error: ‘glDeleteProgram’ was not declared in this scope
             glDeleteProgram(program_);
                                     ^

【问题讨论】:

你没有包含 opengl 标头? 【参考方案1】:

未在范围内声明意味着您没有包含标头,或者没有正确包含它。

  #include <GL/glut.h>

应该给你一切。 如果这不起作用,请尝试 gl.h。

【讨论】:

对不起,我忘了在我的问题中提到这一点,但我也试过这个。输出是一样的。我使用的是 Ubuntu 16.04,我的操作系统可能无法正确安装某些组件?我想不出任何其他原因导致它不起作用! 确保路径设置正确。搜索一个名为 gl.h 的文件,它应该在某个包含目录中。然后包含目录应该在您的系统路径中作为搜索的包含。【参考方案2】:

那些“未声明glXXX”表示您不包括glew。

试试#include "GLEW/include/GL/glew.h 之类的东西,这个想法是必须首先包含glew.h

Glew 用于查找 OpenGL > 1.3 的 glXXX 函数

【讨论】:

以上是关于在 linux 终端上使用 c++ 编译示例 opengl 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Xcode 和终端在 Mac OS 上使用 OpenGL 库编译 c++ 文件

AIX和Linux C++编译器差别总结

错误:在 Linux 上使用 OpenGL 编译 C++ 程序时出现“GL/glfw3.h:没有这样的文件或目录”

如何使用Linux终端(如python,在gcc或g ++中编译一行C ++代码?

高级C和C++编译:无法编译书中提到的示例程序。

无法使用 gcc 在 Linux 中编译任何 c++ 程序,出现一些奇怪的错误 [重复]