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



在我参加的一门大学课程中,我们开始使用OpenGL。教授让我们下载了GLAD和GLFW,但我们没有看到如何使用makefile(我们在Windows 10 64位上使用makefile和mingw-w64编译器(在VS代码中包含并使其正常工作。我正在按照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\gread

GLFW库位于:

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

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

glfw3.dll

libglfw3.a

libglfw3dll.a

在GLFW目录中;包括";文件夹:

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

具有两个头文件:

glfw3.h

glfw3native.h

我在VS代码中的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代码。我应该修改/添加什么来解决问题?

提前感谢

哦,我刚刚看到了高兴的文件夹在哪里,所以试着克服第一个错误:

CC = g++
DEBUG = -g -std=c++2a
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
ODIR = obj
OBJS = $(ODIR)/First_Window.o
INCLUDE = -IC:libsGladinclude
LINK_TARGET = First_Window.exe
all : $(LINK_TARGET)
echo All done
$(LINK_TARGET) : $(OBJS)
$(CC) $(LFLAGS) $^ -o $@
$(ODIR)/%.o : %.cpp
$(CC) $(INCLUDE) $(CFLAGS) $< -o $@

我为高兴文件夹添加了包含路径。您还可以添加任何其他标头路径:

INCLUDE = -IC:libsGladinclude -IC:libsGLFWglfw-3.3.2.bin.WIN64include

正如我在评论中提到的,当你到达链接行时,你可能会得到一个链接器错误。使用链接器选项-l和-l:

LIBS = -LC:libsGLFWglfw-3.3.2.bin.WIN64lib-mingw-w64 -lglfw3 -llibglfw3 -llibglfw3dll

然后将其添加到您的链接行:

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

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

LIBS = -LC:libsGLFWglfw-3.3.2.bin.WIN64lib-mingw-w64 -lglfw3 -lglfw3 -lglfw3dll

但是,看起来你有静态库和动态库的混合——所以我真的不确定你想链接到哪个特定的库,所以你可能可以一次尝试一个,直到找到你需要的库。我猜你真正想要的最后一行只是:

LIBS = -LC:libsGLFWglfw-3.3.2.bin.WIN64lib-mingw-w64 -lglfw3

最新更新