Включите сторонний заголовок и библиотеку, используя makefile и VS Code - PullRequest
1 голос
/ 30 апреля 2020

На университетском курсе, который я посещаю, мы начинаем работать с OpenGL. Профессор заставил нас загрузить GLAD и GLFW, но мы не видели, как включить и заставить все работать в VS Code, используя make-файл (мы используем make-файл и компилятор mingw-w64 на Windows 10 64 бит). Я пишу простой код, следуя руководству 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

Первое, что я сделал в Мой проект C ++ в VS Code должен был изменить файл "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
}

На этом этапе для make-файла я скопировал и вставил make-файл, который показал нас, профессора, просто для компиляции. cpp, связывания .o и конечного результата .exe. Мы никогда не видели, что писать в make-файле в такой ситуации (я почти уверен, что проблема в make-файле), и, кроме того, мы не изучали make-файл достаточно долго, чтобы иметь возможность go в одиночку. Это make-файл:

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 Community, но мы использовали VS Code с самого начала курса. Что я должен изменить / добавить, чтобы решить проблему?

Заранее спасибо

1 Ответ

1 голос
/ 01 мая 2020

О, я только что увидел, где находится папка гладкая, так что попробуйте это, чтобы обойти первую ошибку:

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

Как я уже упоминал в моих комментариях, вы, вероятно, получите ошибку компоновщика при переходе к строке ссылки. Используйте опции компоновщика -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

Но тогда, похоже, у вас есть смесь stati c libs и dynamici c libs - так что я Я не совсем уверен, с какими конкретно c библиотеками вы хотите связать, поэтому, вероятно, вы можете попробовать их по одному, пока не найдете нужные библиотеки. Я предполагаю, что последняя строка, которую вы действительно хотите, это просто:

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