对某些 OpenGL 函数的未定义引用(如果它们尚未在 main 中调用)
undefined reference to some OpenGL functions if they haven't been called in main
如果我定义一个函数,例如 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 headers 的 GL
文件夹。 lib
文件夹包含静态 glew 库(编译时 libdraw.a
)。
当使用此配置从 cmd 调用 make
(如果我没记错的话,从 MinGW-w64 调用 make
)时,所有内容都可以正确编译,但是如果我删除 glClear(GL_COLOR_BUFFER_BIT);
从 main
,我在 g++ -o a.exe main.cpp -I./include -L./lib -lglew32 -lgdi32 -lopengl32 -ldraw
步骤中得到 undefined reference to 'glClear'
错误。
我知道这段代码没有多大意义,它只是一个例子。我想知道如何正确修复这些错误以及它们发生的原因。
这是因为 -ldraw
在库中排在最后。每个库都被添加到二进制文件中以解决未解决的外部问题,然后提供新的依赖项。鉴于 -ldraw
是最后一个,它无法添加新的依赖项,这些依赖项得到解决。
将 -ldraw 移动到第一个库。
g++ -o a.exe main.cpp -I./include -L./lib -ldraw -lglew32 -lgdi32 -lopengl32
如果我定义一个函数,例如 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 headers 的 GL
文件夹。 lib
文件夹包含静态 glew 库(编译时 libdraw.a
)。
当使用此配置从 cmd 调用 make
(如果我没记错的话,从 MinGW-w64 调用 make
)时,所有内容都可以正确编译,但是如果我删除 glClear(GL_COLOR_BUFFER_BIT);
从 main
,我在 g++ -o a.exe main.cpp -I./include -L./lib -lglew32 -lgdi32 -lopengl32 -ldraw
步骤中得到 undefined reference to 'glClear'
错误。
我知道这段代码没有多大意义,它只是一个例子。我想知道如何正确修复这些错误以及它们发生的原因。
这是因为 -ldraw
在库中排在最后。每个库都被添加到二进制文件中以解决未解决的外部问题,然后提供新的依赖项。鉴于 -ldraw
是最后一个,它无法添加新的依赖项,这些依赖项得到解决。
将 -ldraw 移动到第一个库。
g++ -o a.exe main.cpp -I./include -L./lib -ldraw -lglew32 -lgdi32 -lopengl32