【问题标题】:undefined reference to some OpenGL functions if they haven't been called in main未在 main 中调用某些 OpenGL 函数的未定义引用
【发布时间】:2021-03-26 00:46:32
【问题描述】:

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

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


    【解决方案1】:

    这是因为 -ldraw 在库中是最后一个。每个库都被添加到二进制文件中以整理出未解析的外部项,然后提供新的依赖项。鉴于 -ldraw 是最后一个,它无法添加新的依赖项,这些依赖项会得到解决。

    将 -ldraw 移至库的第一个。

    g++ -o a.exe main.cpp -I./include -L./lib -ldraw -lglew32 -lgdi32 -lopengl32 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多