makefile - 无法使用 Makefile 链接到 SFML 库,即使它作为一个衬垫工作
问题描述
这是我的目录结构:
.
├── 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'
我很困惑为什么会发生这种情况,因为上面的一个衬里编译得很好。如果我从代码中删除所有对 SFML 的引用,Makefile 也可以正常工作。LDFLAGS
即使它们是使我的一个班轮链接到 SFML 所需的全部内容,添加是否还不够?如果是这样,还需要什么?
解决方案
-llibrary
在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,在
foo.o -lz bar.o
文件z
之后foo.o
但在bar.o
. 如果bar.o
引用 中的函数z
,则可能不会加载这些函数。
所以把库(-l<lib_1> ... -l<lib_x>
)放在最后一行,在你的目标文件之后。
推荐阅读
- python - 尝试将多个文本文件读入单个 pandas 数据帧时发生 FileNotFoundError
- php - $_SESSION 在访问值之前未设置
- django - 未找到:/media/ 404 77 Django 制作 - ASGI Digital Ocean
- css - 具有线性渐变的 CSS 蒙版图像在 Edge 中不起作用
- javascript - 随机化图片链接到不同的 url JavaScript
- opencv - 概率霍夫变换openCV
- html - SVG 被切断
- java - 在 Java 中查找复杂矩阵的 SVD 矩阵
- sockets - 在使用套接字的 udp 编程中选择端口的最佳方法是什么?
- xml - 让 Oxygen XML Developer 将属性识别为包含 XPath