【问题标题】:Undefined reference errors when linking GLFW on MinGW在 MinGW 上链接 GLFW 时出现未定义的参考错误
【发布时间】:2014-03-25 00:09:15
【问题描述】:

我正在尝试使用 minGW 在 Windows 上使用 GLEW 和 GLFW 开发一个 openGL 应用程序。在当前目录project/ 中,我有目录src/bin/glfw-3.0.4.bin.WIN64/。我在src/ 目录中有文件test.cppglew.hglew.cwglew.h

目录./glfw-3.0.4.bin.WIN64/include/ 包含GLFW/glfw3.h 头文件。

目录./glfw-3.0.4.bin.WIN64/lib-mingw/ 包含glfw3.dllglfw3dll.alibglfw3.a

我的主文件,test.cpp 包含,

#include "glew.h"
#include "GLFW/glfw3.h"

#include <stdio.h>

int main(int argc, char** argv) {
    printf("Hello, World!\n");

    glewInit();
    glfwInit();
}

我正在通过运行从project/目录编译程序(为了便于阅读,分成两行)

gcc -DGLEW_STATIC -DGLFW_DLL -o ./bin/test ./src/*.cpp ./src/glew.c 
-I ./glfw-3.0.4.bin.WIN64/include/ -L ./glfw-3.0.4.bin.WIN64/lib-mingw/ -lglfw3 -lopengl32

我收到以下错误:

undefined reference to `_imp_glfwInit'

我认为问题与我错误地链接 GLFW 库有关。据我了解,包括编译器选项-lglfw3 将告诉gcc 链接./glfw-3.0.4.bin.WIN64/lib-mingw/glfw3.dll,其中包含glfwInit() 的定义。

我查看了与我类似的其他问题的解决方案,他们提出了一些建议,例如将 dll 文件复制到源/二进制目录并更改 -l 选项的顺序,但似乎都没有解决问题我。

【问题讨论】:

  • 您的 gcc 命令分为两行。是为了可读性吗?或者那是您的实际命令(在这种情况下,这是错误的)?另外,我记得,-Ipath-Lpath 必须不带空格。
  • 是的,对不起,我应该注意到 gcc 命令是为了可读性而拆分的。运行不带空格的命令仍然会产生同样的错误。
  • 不能肯定,但我猜你的库有问题。您确定它们与 mingw 兼容并且应该是 64 位的吗?你能用 32 位版本运行它吗?
  • 啊,我真的以为这样可以解决问题。我一直在将 mingw 用于 32 位系统。我切换到使用 glfw-3.0.4.bin.WIN32 但我仍然得到相同的编译时错误。
  • 您能组装最小示例(包含所有必需的源和库)并将其上传到某个地方吗?没有看到就很难诊断出这类问题。

标签: opengl mingw glfw


【解决方案1】:

您的问题是 gcc 遵循严格的库命名约定。它试图找到glfw3.dll.a,但没有找到(因为它被命名为glfw3dll.a - 简单的重命名将解决您的问题)。

下一步它会寻找libglfw3.a,并成功了 - 但它是一个静态库,而在头文件中声明为动态的引用(棘手的窗口 DECLSPECs ......这个问题在例如 linux 上不存在)。所以,它找不到_imp__glfwInit,因为在静态库中它被称为glfwInit,所以你得到一个错误。

删除libglfw3.a 也是一种选择——在这种情况下,gcc 会进一步查找并最终找到glfw3.dll 并使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多