Вот моя структура каталогов:
.
├── 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? Если да, то что еще нужно?