【问题标题】:How can I manually add libraries glfw and glad using g++ (fix undefined reference error)?如何使用 g++ 手动添加库 glfw 和高兴(修复未定义的引用错误)?
【发布时间】:2021-09-02 17:06:53
【问题描述】:

我在尝试使用其他库编译我的程序时遇到 undefined reference 错误。我需要使用什么 g++ 命令来编译我的程序?

我正在努力学习opengl,https://learnopengl.com/Getting-started/Creating-a-window。我似乎无法正确添加库 glad 和 glfw。大多数搜索结果显示如何在 Visual Studio 中添加库;但是,我正在尝试了解编译和链接过程,以便我可以使用我选择的文本编辑器。

我在我的 Windows 10 机器上安装了 mingw64 编译器,并且 g++ 工作。我已经下载了库很高兴和 glfw,并将这些库放在了C:\cpp_lib。下面是该位置的文件树。

C:\cpp_lib
├───glad
│   ├───include
│   │   ├───glad
│   │   │       glad.h
│   │   │
│   │   └───KHR
│   │           khrplatform.h
│   │
│   └───src
│           glad.c
│
└───glfw
    │   LICENSE.md
    │   README.md
    │
    ├───include
    │   └───GLFW
    │           glfw3.h
    │           glfw3native.h
    │
    ├───lib-mingw-w64
    │       glfw3.dll
    │       libglfw3.a
    │       libglfw3dll.a
    │
    ├───lib-static-ucrt
    │       glfw3.dll
    │       glfw3dll.lib
    │
    ├───lib-vc2012
    │       glfw3.dll
    │       glfw3.lib
    │       glfw3dll.lib
    │       glfw3_mt.lib
    │
    ├───lib-vc2013
    │       glfw3.dll
    │       glfw3.lib
    │       glfw3dll.lib
    │       glfw3_mt.lib
    │
    ├───lib-vc2015
    │       glfw3.dll
    │       glfw3.lib
    │       glfw3dll.lib
    │       glfw3_mt.lib
    │
    ├───lib-vc2017
    │       glfw3.dll
    │       glfw3.lib
    │       glfw3dll.lib
    │       glfw3_mt.lib
    │
    └───lib-vc2019
            glfw3.dll
            glfw3.lib
            glfw3dll.lib
            glfw3_mt.lib

我在 C:\learn_opengl\src\main.cpp 有一个 c++ 文件,代码如下:

#include <glad/glad.h>
#include <GLFW/glfw3.h>

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    return 0;
}

我已经尝试了多个命令,但在调用 glfw 函数时总是出现 undefined reference 错误。

命令:

g++ -Wall -g src\main.cpp -IC:\cpp_lib\glfw\include -IC:\cpp_lib\glad\include -o dist\main.exe
C:\learn_opengl>g++ -Wall -g src\main.cpp -IC:\cpp_lib\glfw\include -IC:\cpp_lib\glad\include -o dist\main.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\david\AppData\Local\Temp\ccvyjawi.o:C:\learn_opengl/src/main.cpp:6: undefined reference to `glfwInit'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\david\AppData\Local\Temp\ccvyjawi.o: in function `main':
C:\learn_opengl/src/main.cpp:7: undefined reference to `glfwWindowHint'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\learn_opengl/src/main.cpp:8: undefined reference to `glfwWindowHint'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\learn_opengl/src/main.cpp:9: undefined reference to `glfwWindowHint'
collect2.exe: error: ld returned 1 exit status

为什么不链接库,我应该使用什么命令/选项?

【问题讨论】:

  • -l&lt;libraryname&gt; 和 -L&lt;libary location&gt; 在哪里?
  • @MarekR 库位于 C:\cpp_lib\ 并命名为 glfw 和很高兴。我试过添加-LC:\cpp_lib\glfw -lglfw -LC:\cpp_lib\glad -lglad,但后来我得到C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lglfw C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lglad collect2.exe: error: ld returned 1 exit status
  • 您添加了错误的文件夹。您的链接器不会在文件夹树中搜索。 -LC:\cpp_lib\glfw 应该是 -LC:\cpp_lib\glfw\lib-mingw-w64
  • 我认为由于某种原因您需要链接到 windows api 库 Gdi32.lib 相关:https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-describepixelformat
  • @drescherjm 一旦我将glad.c 编译成一个dll 文件,它就可以工作了。感谢您的帮助!

标签: c++ windows linker g++


【解决方案1】:

首先,我必须使用命令 g++ -Wall -g -IC:\cpp_lib\glad\include -c -o C:\cpp_lib\glad\glad.dll C:\cpp_lib\glad\src\glad.c 编译高兴。

然后,我需要为每个库添加选项,包括 gdi32 -LC:\cpp_lib\glfw\lib-mingw-w64 -lglfw3 -lgdi32 -LC:\cpp_lib\glad -lglad。

【讨论】:

  • 第一个命令创建一个对象文件(通常具有.o 扩展名),重命名为.dll。如果这确实有效,我不确定如何...生成 dll 的正确方法是使用 -shared 而不是 -c。
猜你喜欢
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2014-06-23
相关资源
最近更新 更多