Неспособность соединиться с библиотеками SFML, используя Makefile, даже если он работает как одна строка - PullRequest
1 голос
/ 14 февраля 2020

Вот моя структура каталогов:

.
├── a.out
├── assets
│   └── ...
├── build
│   ├── apps
│   └── objects
├── include
│   └── engine
│       └── Class.h
├── Makefile
└── src
    ├── engine
    │   └── Class.cpp
    └── program.cpp

Я могу скомпилировать program.cpp в a.out, используя следующую команду:

g++ src/engine/*.cpp src/program.cpp -Iinclude/ -L/usr/lib -lstdc++ -lm -lsfml-graphics -lsfml-window -lsfml-system -Wall

Пока это работает, этот проект вероятен расти и, очевидно, делать серьезный Makefile предпочтительнее, чем прямая компиляция с одним вкладышем. Поэтому я использовал формат Makefile, который использовал много раз раньше, и он прекрасно работает, но в прошлом я никогда не связывал его с внешними библиотеками. Вот Makefile, который я использую:

CXX      := -g++
CXXFLAGS := -std=gnu++0x -g -Wall
LDFLAGS  := -L/usr/lib -lstdc++ -lm -lsfml-graphics -lsfml-window -lsfml-system
BUILD    := ./build
OBJ_DIR  := $(BUILD)/objects
APP_DIR  := $(BUILD)/apps
TARGET   := program
INCLUDE  := -Iinclude/
SRC      := $(wildcard src/engine/*.cpp) $(wildcard src/*.cpp)
OBJECTS  := $(SRC:%.cpp=$(OBJ_DIR)/%.o)

all: build $(APP_DIR)/$(TARGET)

$(OBJ_DIR)/%.o: %.cpp
    @mkdir -p $(@D)
    $(CXX) $(CXXFLAGS) $(INCLUDE) -o $@ -c $<

$(APP_DIR)/$(TARGET): $(OBJECTS)
    @mkdir -p $(@D)
    $(CXX) $(CXXFLAGS) $(INCLUDE) $(LDFLAGS) -o $(APP_DIR)/$(TARGET) $(OBJECTS)

.PHONY: all build clean debug release

build:
    @mkdir -p $(APP_DIR)
    @mkdir -p $(OBJ_DIR)

debug: CXXFLAGS += -DDEBUG -g
debug: all

release: CXXFLAGS += -O2
release: all

clean:
    -@rm -rvf $(OBJ_DIR)/*
    -@rm -rvf $(APP_DIR)/*

Однако это приводит к ошибкам компиляции в виде неопределенных ссылок на методы SFML:

./build/objects/src/engine/Class.o: In function `Class::draw()':
/dir/Class.cpp:60: undefined reference to `sf::RenderTarget::getView() const'

Я запутался как почему это происходит, учитывая, что один лайнер выше компилируется нормально. Makefile также отлично работает, если я удаляю все ссылки на SFML из моего кода. Неужели добавленных LDFLAGS недостаточно, хотя они все, что нужно, чтобы сделать мою однострочную ссылку на SFML? Если да, то что еще нужно?

1 Ответ

1 голос
/ 14 февраля 2020

С г cc параметры ссылки

-llibrary

Имеет значение, где в команде, которую вы пишете этот вариант; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, foo.o -lz bar.o ищет библиотеку z после файла foo.o, но до bar.o. Если bar.o относится к функциям в z, эти функции могут не загружаться.

Поэтому ставьте библиотеки (-l<lib_1> ... -l<lib_x>) последними в строке после ваших объектных файлов.

...