【问题标题】:Include third-party header and library using makefile and VS Code使用 makefile 和 VS Code 包含第三方头文件和库
【发布时间】:2020-08-14 14:43:19
【问题描述】:

在我参加的一门大学课程中,我们开始使用 OpenGL。教授让我们下载 GLAD 和 GLFW,但我们没有看到如何使用 makefile 包含和使一切在 VS Code 中运行(我们在 Windows 10 64 位上使用 makefile 和 mingw-w64 编译器)。 我正在按照 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\高兴\包括\高兴

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,无法单独使用它。这是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。我应该修改/添加什么来解决问题?

提前谢谢你

【问题讨论】:

  • glad/glad.h 住在哪里? glad/ 文件夹是否与您的 First_Window.cpp 文件位于同一位置? - 如果不是,您需要在编译行中包含该路径,例如:-I&lt;path_to_glad_folder&gt;
  • 那么接下来你可能会遇到 lib 问题(链接到glad 库),但首先要克服第一个错误 :)

标签: c++ makefile include mingw-w64 include-path


【解决方案1】:

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

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 $@

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

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

正如我在 cmets 中提到的,当您到达链接行时,您可能会收到链接器错误。使用链接器选项 -l 和 -L:

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

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

$(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

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

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

【讨论】:

  • 不幸的是我一开始就卡住了:(。我按照你告诉我的那样编辑了makefile;创建变量“INCLUDE”并将其添加到编译行。但它一直给我错误“否这样的文件或目录”,指的是“glad/glad.h”。它仍然没有给我任何链接错误。我发现将目录包含在 c_cpp_properties.json 文件中,只是为了让它们被 Intellisense 引擎识别. 如果我理解正确,真正的包含发生在 Tasks.json 文件中,但即使在 Tasks.json 中键入命令,它也会给我同样的错误。
  • 我的错误。子文件夹“glad”在包含行中,所以它应该是:-IC:\libs\Glad\include 而不是-IC:\libs\Glad\include\glad :)
  • 另外 - 暂时忘记 vscode - 直接使用 make (命令行等) vs code 与此无关。它全部包含在makefile中。 vs 代码只运行make,仅此而已。稍后再看 vs 代码集成:)
  • 另外 - -IC:\libs\GLFW\glfw-3.3.2.bin.WIN64\include\GLFW 也一样,应该是:-IC:\libs\GLFW\glfw-3.3.2.bin.WIN64\include - 我也刚刚更新了它。因为我没有这些库,所以我无法对其进行测试。
  • 整理您的其他问题。通过执行以下操作选择您要链接到的特定库:-l:libglfw3dll.a-l:libglfw3.a-l:glfw3.dll-l:... 表示法(注意冒号)将链接到文字名称 - 这样您就可以将您的库放回同一个文件夹中。
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多