使用 makefile 和 VS Code 包含第三方头文件和库

Include third-party header and library using makefile and VS Code

在我参加的大学课程中,我们开始使用 OpenGL。教授让我们下载 GLAD 和 GLFW,但我们没有看到如何使用 makefile(我们在 Windows 10 64 位上使用 makefile 和 mingw-w64 编译器)在 VS Code 中包含并使一切正常工作。 我正在按照 OpenGL 指南编写一个简单的代码:

#include "glad/glad.h"
#include "glfw3.h"

int main(int argc, char* argv[])
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    return 0;
}

GLAD 头文件位于:

C:\libs\Glad\include\glad

GLFW 库位于:

C:\libs\GLFW\glfw-3.3.2.bin.WIN64\lib-mingw-w64

并且在此目录中有 3 个文件:

glfw3.dll

libglfw3.a

libglfw3dll.a

在 GLFW 目录中还有一个“include”文件夹:

C:\libs\GLFW\glfw-3.3.2.bin.WIN64\include\GLFW

有两个头文件:

glfw3.h

glfw3native.h

我在 VS Code 中的 C++ 项目中做的第一件事是修改“c_cpp_properties.json”文件,包括我在 .cpp 中包含的文件的相对路径。我还包括了库的路径,虽然最后,在代码中,我只包括了头文件:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/libs/Glad/include/**",
                "C:/libs/GLFW/glfw-3.3.2.bin.WIN64/include/GLFW/",
                "C:/libs/GLFW/glfw-3.3.2.bin.WIN64/lib-mingw-w64/"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\MinGW-64\mingw64\bin\gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++20",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

至此,对于makefile,我复制并粘贴了一个向我们展示教授的makefile,只是为了编译.cpp,链接.o和最终结果.exe。在这种情况下,我们从未见过在 makefile 中写什么(我很确定问题出在 makefile 中),此外,我们对 makefile 的研究时间还不够长,无法独立完成。这是生成文件:

CC = g++
DEBUG = -g -std=c++2a
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
ODIR = obj
OBJS = $(ODIR)/First_Window.o

LINK_TARGET = First_Window.exe

all : $(LINK_TARGET)
    echo All done

$(LINK_TARGET) : $(OBJS)
    $(CC) $(LFLAGS) $^ -o $@

$(ODIR)/%.o : %.cpp
    $(CC) $(CFLAGS) $< -o $@

从终端编译:

g++ -Wall -c -g -std=c++2a First_Window.cpp -o obj/First_Window.o
First_Window.cpp:1:10: fatal error: glad/glad.h: No such file or directory
 #include "glad/glad.h"
          ^~~~~~~~~~~~~
compilation terminated.
mingw32-make: *** [makefile:17: obj/First_Window.o] Error 1

我找到的所有指南,甚至在我正在阅读的同一本书中,都提到了 VS 社区,但我们从课程开始就使用了 VS Code。我应该怎样modify/add解决问题?

提前致谢

哦,我刚看到 glad 文件夹在哪里,所以试试这个来克服第一个错误:

CC = g++
DEBUG = -g -std=c++2a
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
ODIR = obj
OBJS = $(ODIR)/First_Window.o
INCLUDE = -IC:\libs\Glad\include

LINK_TARGET = First_Window.exe

all : $(LINK_TARGET)
    echo All done

$(LINK_TARGET) : $(OBJS)
    $(CC) $(LFLAGS) $^ -o $@

$(ODIR)/%.o : %.cpp
    $(CC) $(INCLUDE) $(CFLAGS) $< -o $@

我在其中添加了 glad 文件夹的包含路径。您还可以添加任何其他 header 路径:

INCLUDE = -IC:\libs\Glad\include -IC:\libs\GLFW\glfw-3.3.2.bin.WIN64\include

正如我在评论中提到的,当您到达 link 行时,您可能会收到 linker 错误。使用 linker 选项 -l 和 -L:

LIBS = -LC:\libs\GLFW\glfw-3.3.2.bin.WIN64\lib-mingw-w64 -lglfw3 -llibglfw3 -llibglfw3dll

然后将其添加到您的 link 行:

$(LINK_TARGET) : $(OBJS)
    $(CC) $(LFLAGS) $(LIBS) $^ -o $@

注意:对于 windows,我不能 100% 确定您是否需要省略库名称中的 "lib",因此可能是这样的:

LIBS = -LC:\libs\GLFW\glfw-3.3.2.bin.WIN64\lib-mingw-w64 -lglfw3 -lglfw3 -lglfw3dll

但是看起来您混合使用了静态库和动态库 - 所以我不太确定您想要 link 哪些特定库,所以您可以一次尝试一个,直到你找到你需要的库。我猜你真正想要的最后一行只是:

LIBS = -LC:\libs\GLFW\glfw-3.3.2.bin.WIN64\lib-mingw-w64 -lglfw3