C++ GLEW函数可以';找不到

C++ GLEW函数可以';找不到,c++,opengl,glew,glfw,C++,Opengl,Glew,Glfw,我在Ubuntu上,使用OpenGL、GLEW和GLFW编写应用程序。我正在使用Eclipse作为IDE,在尝试使用诸如glGenRenderbuffer之类的函数时遇到问题。我在Windows下设置了一个非常类似的结构,但无法在Linux上运行 我正在链接到glfw和GLEW图书馆。我能够编译和运行我的应用程序的一部分,并且可以初始化GLFW和GLEW。从这些测试运行中,我了解到以下内容: OpenGL version: 4.2.0 NVIDIA 304.64 Using GLEW 1.6.0

我在Ubuntu上,使用OpenGL、GLEW和GLFW编写应用程序。我正在使用Eclipse作为IDE,在尝试使用诸如glGenRenderbuffer之类的函数时遇到问题。我在Windows下设置了一个非常类似的结构,但无法在Linux上运行

我正在链接到glfw和GLEW图书馆。我能够编译和运行我的应用程序的一部分,并且可以初始化GLFW和GLEW。从这些测试运行中,我了解到以下内容:

OpenGL version: 4.2.0 NVIDIA 304.64
Using GLEW 1.6.0
但是,我无法编译函数glGenRenderbuffer(或其他帧缓冲区函数)。我尝试过在名字中添加EXT和ARB,也尝试过在没有任何运气的情况下使用glex.h。据我所知,GLEW的目的是处理所有扩展问题,对吗

源文件(VolumeRenderer.cpp)包括以下内容:

#include <glm/gtc/matrix_transform.hpp>
#include <VolumeRenderer.h>
#include <GL/glew.h>
#include <GL/glfw.h>
我得到的只是“无法解析函数“glGenRenderBuffers”。

查看包含的GL/glew.h标题,我发现以下几行:

#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)
#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT)

但是编译器仍然找不到该函数。有什么我忘记了的吗,或者我可以运行一些测试和检查来查看发生了什么?

好的,所以我基本上是通过将我的Eclipse项目文件一个文件地复制到一个新的空项目中来实现的。然而,在那之前我做了一些其他的事情。首先,我按照有用的评论中的建议移动了include。我还删除了glm之类的东西。没有成功!然后我在Eclipse中用一个.cpp文件创建了一个简单的项目,并链接到glfw和GLEW:

#include <GL/glew.h>
#include <GL/glfw.h>
#include <iostream>
#include <cstdlib>

int main()
{
  if (glfwInit() != GL_TRUE) {
    std::cout << "glfwInit() failed\n";
    exit(1);
  }
  if (!glfwOpenWindow(800, 600, 8 , 8, 8, 8, 8, 8, GLFW_WINDOW)) {
    std::cout << "glfwOpenWindow() failed\n";
    exit(1);
  }
  char *glVersion = (char*)glGetString(GL_VERSION);
  if (glVersion) {
    std::cout << "OpenGL version: " << glVersion << "\n";
  }
  GLenum err = glewInit();
  if (err != GLEW_OK) {
    std::cout << "GLEW init failed: " << glewGetErrorString(err) << "\n";
    exit(1);
  } else {
    std::cout << "Using GLEW " << glewGetString(GLEW_VERSION) << "\n";
  }
  GLuint buf;
  glGenRenderbuffers(1, &buf);
  exit(0);
}
#包括
#包括
#包括
#包括
int main()
{
如果(glfwInit()!=GL_TRUE){

std::cout好吧,我基本上是通过将我的Eclipse项目文件一个文件一个文件复制到一个新的空项目中来实现的。然而,在此之前我做了一些其他的事情。首先,我按照有用的评论中的建议移动了包含项。我还删除了glm之类的内容。没有成功!然后我用一个.cpp文件在Eclipse中创建了一个简单的项目e、 并链接到glfw和GLEW:

#include <GL/glew.h>
#include <GL/glfw.h>
#include <iostream>
#include <cstdlib>

int main()
{
  if (glfwInit() != GL_TRUE) {
    std::cout << "glfwInit() failed\n";
    exit(1);
  }
  if (!glfwOpenWindow(800, 600, 8 , 8, 8, 8, 8, 8, GLFW_WINDOW)) {
    std::cout << "glfwOpenWindow() failed\n";
    exit(1);
  }
  char *glVersion = (char*)glGetString(GL_VERSION);
  if (glVersion) {
    std::cout << "OpenGL version: " << glVersion << "\n";
  }
  GLenum err = glewInit();
  if (err != GLEW_OK) {
    std::cout << "GLEW init failed: " << glewGetErrorString(err) << "\n";
    exit(1);
  } else {
    std::cout << "Using GLEW " << glewGetString(GLEW_VERSION) << "\n";
  }
  GLuint buf;
  glGenRenderbuffers(1, &buf);
  exit(0);
}
#包括
#包括
#包括
#包括
int main()
{
如果(glfwInit()!=GL_TRUE){

std::cout如果您包含生成过程输出的错误消息,它将对我们有所帮助。GLEW应该始终首先包含。最好在任何像
VolumeRenderer
这样的用户头之前,它可以包含任何内容。您是否检查OpenGL版本(例如,
GLEW\u版本3\u 2
)或GLEW提供的扩展变量(例如,
GLEW\u EXT\u framebuffer\u object
)?这些将告诉您GLEW正在与之交谈的驱动程序是否具有您正在寻找的功能。@NicolBolas:这一点很好。但是这次它没有改变任何东西。@VictorSand:一个无法解析的符号意味着在库中找不到该符号。正如NicolBolas已经提到的,您应该在所有其他内容之前包含GLEW.h。t这是因为is使用预处理器宏将函数名重写为在GLEW库中找到的名称。如果没有这些,符号将保持不变,并且您将得到您观察到的错误。如果您包含生成过程输出的错误消息,这将对我们有所帮助。GLEW应始终首先包含。最好在任何用户标题之前类似于
VolumeRenderer
,它可以包含任何内容。您是否正在检查OpenGL版本(例如
GLEW\u version\u 3\u 2
)或GLEW提供的扩展变量(例如,
GLEW\u EXT\u framebuffer\u object
)?这些将告诉您GLEW正在与之交谈的驱动程序是否具有您正在寻找的功能。@NicolBolas:这一点很好。但是这次它没有改变任何东西。@VictorSand:一个无法解析的符号意味着在库中找不到该符号。正如NicolBolas已经提到的,您应该在所有其他内容之前包含GLEW.h。t这是因为is使用预处理器宏将函数名重写为在GLEW库中找到的名称。没有这些,符号将保持不变,并且您将看到错误。