c++ - 对某些 OpenGL 函数的 undefined reference (如果它们尚未在 main 中调用)

标签 c++ opengl linker linker-errors glew

如果我定义一个函数,例如 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);
}

生成文件:

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/

相关文章:

c++ - __cdecl 和 (void) 是什么意思?

opengl - 延迟渲染 vs 前向渲染 + early-z

ffmpeg - 在 Rust 上链接 ffmpeg 库会给出 `vdp_device_create_x11`(缺少 libvdpau-dev?)

c++ - ld 警告 : stack subl instruction is too different from dwarf stack size on OS X

c++ - 单文件程序的未定义虚表

c++ - c++标准库中的所有函数都需要有外部链接吗?

c++ - 制服和变量的 OpenGL 和 GLSL 内存对齐

compiler-construction - 链接器和加载器引用

c++ - DEM 到 TIN 库

delphi - 计算对象的位置,使其与屏幕像素匹配