在OS X上链接Box2D应用程序

Issue Linking Box2D application on OS X

本文关键字:Box2D 应用程序 链接 OS      更新时间:2023-10-16

我有一款SDL游戏,这是我的第一个真正的项目。我决定引入Box2D物理,因为我不喜欢碰撞检测。因此,我将其安装到/usr/local/lib/Box2D,文件夹中是Box2D.h和支持文件夹。我用MacVim编码在OSX 10.9.2上开发,并从命令行clang++编译器。

在我的游戏代码中,我只是想创建一个简单的世界来测试事情:

#include <Box2D/Box2D.h>
.......
world = new b2World(b2Vec2(0.0,9.81));

我的make命令找到了库,但是试图构建时出错。

$ make clean && make
rm -rf obj bin
clang++ -Wall -c -std=c++11 -I/usr/local/lib src/Ball.cpp -o obj/Ball.o
clang++ -Wall -c -std=c++11 -I/usr/local/lib src/Game.cpp -o obj/Game.o
clang++ -Wall -c -std=c++11 -I/usr/local/lib src/Paddle.cpp -o obj/Paddle.o
clang++ -Wall -c -std=c++11 -I/usr/local/lib src/TextureManager.cpp -o obj/TextureManager.o
clang++ -Wall -c -std=c++11 -I/usr/local/lib src/main.cpp -o obj/main.o
clang++ -framework SDL2 -framework SDL2_image -F /Library/Frameworks -L/usr/local/lib/Box2D    obj/Ball.o   obj/Game.o   obj/Paddle.o   obj/TextureManager.o   obj/main.o -o bin/game 
Undefined symbols for architecture x86_64:
  "b2World::b2World(b2Vec2 const&)", referenced from:
      Game::init() in Game.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [game] Error 1

这是我的Makefile。Box2D位于/usr/local/lib/Box2D/Box2D我很确定我的问题在Makefile的某个地方。

CXX = clang++
CXXFLAGS = -Wall -c -std=c++11 -I/usr/local/lib
SDL = -framework SDL2 -framework SDL2_image
LDFLAGS = $(SDL) -F /Library/Frameworks -L/usr/local/lib/Box2D
SRC_DIR = src
SOURCES = $(wildcard $(SRC_DIR)/*.cpp)
OBJ_DIR = obj
OBJECTS = $(subst $(SRC_DIR)/, $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SOURCES)))
#$(warning $(OBJECTS))
BIN_DIR = bin
EXE = game
# run these no matter what
.PHONY: all clean run
all: $(EXE)
$(EXE): $(OBJECTS)
    @mkdir -p $(BIN_DIR)
    $(CXX) $(LDFLAGS) $(OBJECTS) -o $(BIN_DIR)/$(EXE) 
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    @mkdir -p $(OBJ_DIR)
    $(CXX) $(CXXFLAGS) $< -o $@
clean:
    rm -rf obj bin
run:
    ./$(BIN_DIR)/$(EXE)

似乎你从来没有真正的链接 Box2D库的任何地方?您使用-L来指定在链接时要搜索的目录,但是我没有看到-l选项来实际链接Box2D库(无论它叫什么)。

你的输出行似乎证实了这一点:

clang++ -framework SDL2 -framework SDL2_image -F /Library/Frameworks -L/usr/local/lib/Box2D    obj/Ball.o   obj/Game.o   obj/Paddle.o   obj/TextureManager.o   obj/main.o -o bin/game

你需要得到-lbox2d(或任何正确的名称为Box2D库是)在那里。