Makefiles让我很困惑。我正试图"制造"我在Windows中工作过的项目。令人困惑的部分实际上是从头开始构建make文件。我也想尝试链接到SDL2库,这是在' .a'格式。
到目前为止,这是我的make文件的代码,我尝试了多个版本,这是最新的:
CXX = gcc
OUT = Engine
SRC =Software-Rendering/src/
SDL_INCLUDE_DIR =Software-Rendering/lib/SDL2/include/SDL/
LIB_DIR =Software-Rendering/lib/SDL2/x86/linuxLib/
SDL = -l${LIB_DIR}libSDL -l${LIB_DIR}/libSDL2main
CPP_FILES =Bitmap.cpp Main.cpp Vector3.cpp Window.cpp
H_FILES =Bitmap.h ErrorReport.h Vector3.h Window.h
O_FILES = Bitmap.o ErrorReport.o Main.o Vector3.o Window.o
all: $(OUT)
$(OUT): $(O_FILES)
$(CXX) -o $@ $^ ${SDL}
#Making all of the object files down
$(O_FILES): $(H_FILES)
$(CXX) -c $(CPP_FILES)
#Make sure we can easily clean up the directory
clean:
rm -f Engine ${O_FILES}
clean_obj:
rm -f ${O_FILES}
我决定把#34; .a"在我的项目中的特殊指南中的文件,所以每当有人在github上克隆我的存储库时,所有用于编译和链接的文件都已存在。
为什么这不起作用,我该如何才能使它发挥作用?
答案 0 :(得分:1)
您的库链接指令错误 - -l
前缀lib
到您指定的名称,然后搜索-L
选项设置的libdir路径。所以你想要的是:
SDL = -L$(LIB_DIR) -lSDL -lSDL2main
通过使用库的标准varnames可以使它更清晰/更标准:
LDFLAGS = -L$(LIB_DIR)
LDLIBS = -lSDL -lSDL2main
$(OUT): $(O_FILES)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
此外,摆脱显式命令来编译源文件 - 默认的内置规则很好,更容易使用。