如果我定义一个函数,例如 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);
}
生成文件
:
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 header 的 GL
文件夹。 lib
文件夹包含静态 glew 库(以及编译时的 libdraw.a
)。
当使用此配置从 cmd 调用 make
(如果我没记错的话,就是从 MinGW-w64 调用 make
)时,所有内容都可以正确编译,但是如果我删除glClear(GL_COLOR_BUFFER_BIT);
来自 main
,我在 g++ -o a.exe 上得到了
步骤。undefined reference to 'glClear'
错误main.cpp -I./include -L./lib -lglew32 -lgdi32 -lopengl32 -ldraw
我知道这段代码没有多大意义,它只是一个例子。我想知道如何正确修复这些错误以及它们发生的原因。
最佳答案
这是因为 -ldraw
在库中是最后一个。每个库都被添加到二进制文件中以解决 Unresolved external 问题,然后提供新的依赖项。给定 -ldraw
是最后一个,它不能添加新的依赖项,这将得到解决。
将 -ldraw 移动到第一个库。
g++ -o a.exe main.cpp -I./include -L./lib -ldraw -lglew32 -lgdi32 -lopengl32
关于c++ - 对某些 OpenGL 函数的 undefined reference (如果它们尚未在 main 中调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65304938/