对某些 OpenGL 函数的未定义引用(如果它们尚未在 main 中调用)

undefined reference to some OpenGL functions if they haven't been called in main

如果我定义一个函数,例如 void draw(),其中包含 glClearglDrawArraysglDrawElements(对于其他一些 OpenGL 函数也可能是这种情况)一个单独的文件到主文件,然后从 main 函数调用 draw()draw 内部使用的 GL 函数存在未定义的引用错误。如果在 main 内的任何地方直接额外调用相同的 GL 函数(即使它是在调用 draw() 之后),则不会发生错误。此外,并非所有 GL 函数都会出现错误,例如调用 glUniform1f(1,1).

时不会出现错误

例如,我有一个文件夹,其中包含 main.cppdraw.hppdraw.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