使用 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
在我参加的大学课程中,我们开始使用 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