You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:40:06