BSD make中多目标文件链接目标的兼容实现问题
兼容GNU make和BSD make的dwm Makefile解决方案
要解决BSD make链接时缺失util.o、drw.o的问题,核心是调整目标依赖关系,让make触发通用的多目标文件链接规则,而非单个.c文件的编译链接规则。
修改后的Makefile
# 定义所有需要的目标文件 OBJS = dwm.o util.o drw.o # 让dwm依赖所有目标文件 dwm: $(OBJS) # 为dwm目标追加链接库 dwm: LDLIBS += -lX11 -lXft -lfontconfig # 通用编译/预编译参数(根据实际需求调整) CFLAGS = -pipe -g -std=c99 -pedantic -Wno-deprecated-declarations CPPFLAGS = -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION="6.4"
原理说明
- 原写法问题:BSD make的
.c→可执行文件隐式规则仅使用单个源文件(${.IMPSRC}即dwm.c),不会自动将依赖列表中的util.o、drw.o加入链接命令;而GNU make的隐式规则会额外处理依赖的.o文件,所以原写法在gmake中能正常工作。 - 修改后逻辑:让
dwm直接依赖所有.o文件,此时gmake和BSD make都会触发默认的多目标文件链接规则——该规则在两个版本的make中行为一致,会将所有依赖的.o文件作为输入进行链接,同时正确应用LDLIBS中定义的链接库。
简化写法(无需OBJS变量)
如果不想用变量,直接显式列出所有依赖也能达到同样效果:
dwm: dwm.o util.o drw.o dwm: LDLIBS += -lX11 -lXft -lfontconfig # 通用参数同前 CFLAGS = -pipe -g -std=c99 -pedantic -Wno-deprecated-declarations CPPFLAGS = -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION="6.4"
内容的提问来源于stack exchange,提问作者fumanchez
相关产品推荐
相关产品推荐

