Не могу понять, как правильно форматировать Makefile с использованием SDL2. Неопределенная ссылка

#c #ubuntu #makefile #sdl-2

#c #ubuntu #makefile #sdl-2

Вопрос:

Makefile:

 OBJS = Instantiation
Exec_NAME = Test.exe
CC = g   #Compiler name
COMPILER_FLAGS = -c -g -Wall -std=c  11
#Issue exists somewhere in these next 3 lines, but what, how, why :( ?
INC = -I/SDLDEPS/include
LIB = -L/SDLDEPS/lib
LINKER_FLAGS = -lmingw32 -lSDL2main -lSDL2 #just saw this a lot, not sure what the mingw32 is.

#inclusion of $(INC) $(LIB) $(LINKER_FLAGS) not right
all: $(Exec_NAME)
$(Exec_NAME): $(OBJS).o
    $(CC) -o $(Exec_NAME) $(OBJS).o
Instantiation.o: $(OBJS).cpp
    $(CC) $(COMPILER_FLAGS) $(INC) $(LIB) $(LINKER_FLAGS) $(OBJS).cpp

clean:
        rm -f $(Exec_NAME) $(OBJS).o
rebuild:
        make clean
        make
  

 //Main.cpp
#include <iostream>
#include "Window.h"
//#include "SDLDeps/include/SDL.h"
#include "SDLDeps/include/SDL.h"
int main(int argc, char** argv){
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
        std::cerr << "SDL Failed to initalizen";
    else
        std::cout << "Great Success";
    Window window("TEST WINDOW");
    while(!window.isClosed()){
        window.pollEvents();
        window.Clear();
    }
    //std::string string = "";
    //std::cout << "HELLO PERSON What is your name?n";
    //std::cin >> string;
    //std::cout << string << "!n";
    return 0;
}
  

 //Window.h I don't think Window.cpp is necessary as the issue is linking, I think.
#ifndef WINDOW_H
#define WINDOW_H
#include <string>
#include "SDLDeps/include/SDL.h"
//#include "SDL.h"
#include <iostream>

class Window {
private:
    std::string title;
    int width, height;

    bool closed;    
    
    bool init();

    SDL_Window* window;
    SDL_Renderer* renderer;
public:
    Window(const std::stringamp;, int = 800, int = 600);
    ~Window();
    
    void pollEvents();
    void Clear() const;
    inline bool isClosed() { return closed; }
};
#endif // !WINDOW_H
  

 //    Instantiation.cpp- just a file that includes files that I am compiling:
        #include "Window.cpp"
        #include "Main.cpp"
  

Я довольно новичок в создании ссылок и «продвинутых» вещей с makefiles. Но часы
погуглив, я не могу понять, почему я продолжаю получать:
/mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:13: неопределенная ссылка на SDL_DestroyWindow' /usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:14: undefined reference to SDL_DestroyRenderer’
/usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/ Self/TestSDL/Window.cpp: 15: неопределенная ссылка на SDL_Quit' /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:19: undefined reference to SDL_Init’
/usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:23: неопределенная ссылка на SDL_CreateWindow' /usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:28: undefined reference to SDL_CreateRenderer’
/usr/bin/ld: Создание экземпляра.o: в функции Window::pollEvents()': /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:38: undefined reference to SDL_PollEvent’
/usr/bin/ld: Создание экземпляра.o: в функции Window::Clear() const': /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:72: undefined reference to SDL_SetRenderDrawColor’
/usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:73: неопределенная ссылка на SDL_RenderClear' /usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:81: undefined reference to SDL_SetRenderDrawColor’
/usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp: 82: неопределенная ссылка на SDL_RenderFillRect' /usr/bin/ld: /mnt/c/users/nichorsin598/source/repos/Self/TestSDL/Window.cpp:88: undefined reference to SDL_RenderPresent’

Все SDL-файлы не определены, но я не получаю сообщение об ошибке, в котором говорится, что SDL.h не определен, так что это либо как-то связано с библиотеками, либо с чем-то еще. Путь к файлу: TestSDL- базовый каталог TestSDL SDLDeps- включает 2 папки include и lib include- включает все файлы .h, lib- включает SDL2.dll , SDL2, SDL2Main, SDL2test Если кто-нибудь может помочь, я был бы очень признателен.

Ответ №1:

Существует множество различных SDL2 библиотек для разных компонентов. Я использую pkg-config, чтобы получить флаги компиляции и компоновщика примерно так:

 SDL2_INCS := $(shell pkg-config sdl2 --cflags) 
    $(shell pkg-config SDL2_image --cflags) 
    $(shell pkg-config SDL2_ttf --cflags) 
    $(shell pkg-config SDL2_net --cflags) 
    $(shell pkg-config SDL2_mixer --cflags)

SDL2_LIBS := $(shell pkg-config sdl2 --libs) 
    $(shell pkg-config SDL2_image --libs) 
    $(shell pkg-config SDL2_ttf --libs) 
    $(shell pkg-config SDL2_net --libs) 
    $(shell pkg-config SDL2_mixer --libs)

Instantiation.o: $(OBJS).cpp
    $(CC) $(COMPILER_FLAGS) $(SDL2_INCS) -o Instantiation.o $(SDL2_LIBS) $(OBJS).cpp
  

Комментарии:

1. Вы должны иметь возможность передавать несколько библиотек в один pkg-config вызов.