【发布时间】:2021-03-26 00:46:32
【问题描述】:
如果我在主文件的单独文件中定义一个函数,例如 void draw(),包含 glClear、glDrawArrays 或 glDrawElements(也可能是其他一些 OpenGL 函数的情况),然后从main 函数调用draw(),在draw 内部使用的GL 函数存在未定义的引用错误。如果在main 内的任何地方直接额外调用了相同的GL 函数(即使是在调用draw() 之后),则不会发生该错误。此外,并非所有 GL 函数都会出现该错误,例如调用 glUniform1f(1,1) 时不会出现错误。
例如,我有一个文件夹,其中包含 main.cpp、draw.hpp、draw.cpp、Makefile、include 文件夹和 lib 文件夹。
main.cpp:
#define GLEW_STATIC
#include <GL/glew.h>
#include "draw.hpp"
int main()
{
glewExperimental = GL_TRUE;
glewInit();
glClear(GL_COLOR_BUFFER_BIT);
draw();
}
draw.hpp:
#pragma once
void draw();
draw.cpp:
#include "draw.hpp"
#define GLEW_STATIC
#include <GL/glew.h>
void draw()
{
glClear(GL_COLOR_BUFFER_BIT);
}
Makefile:
a.exe: main.cpp draw.hpp draw.cpp
g++ -c -o lib/libdraw.a draw.cpp -I./include
g++ -o a.exe main.cpp -I./include -L./lib -lglew32 -lgdi32 -lopengl32 -ldraw
include 文件夹包含一个带有 glew 标题的 GL 文件夹。 lib 文件夹包含静态 glew 库(以及编译时的 libdraw.a)。
当使用这种配置从 cmd 调用 make(如果我没记错的话,就是从 MinGW-w64 调用 make)时,一切都编译没有错误,但是如果我从 main 中删除 glClear(GL_COLOR_BUFFER_BIT);,我会得到g++ -o a.exe main.cpp -I./include -L./lib -lglew32 -lgdi32 -lopengl32 -ldraw 步骤上的 undefined reference to 'glClear' 错误。
我知道这段代码没有多大意义,它只是一个例子。我想知道如何正确修复这些错误,无论它们发生的原因。
【问题讨论】:
标签: c++ opengl linker linker-errors glew