首页 > 解决方案 > 无法使用 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 所需的全部内容,添加是否还不够?如果是这样,还需要什么?

标签: makefilecompilationlinkerg++sfml

解决方案


gcc 链接选项

-llibrary

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,在foo.o -lz bar.o文件z之后foo.o但在bar.o. 如果bar.o引用 中的函数z,则可能不会加载这些函数。

所以把库(-l<lib_1> ... -l<lib_x>)放在最后一行,在你的目标文件之后。


推荐阅读