我有一个 Makefile。
在安装了 gmake 和 make 的 FreeBSD 机器上,我使用这两个工具运行相同的 Makefile。
make和gmake的输出日志不一样。为什么是这样?我该如何“解决”这个问题?
日志如下:
$ gmake
compile main.cpp
linking myout
$ 制作
c++ -O2 -pipe -c main.cpp -o main.o
linking myout
$猫Makefile
TARGET = myout
default: $(TARGET)
SRCS = main.cpp
OBJS = $(SRCS:%.cpp=%.o)
default: $(BIN)
%.o: %.cpp
@echo compile $<
@$(CXX) -c $< -o $@
$(TARGET): $(OBJS)
@echo linking $@
@$(CXX) $(OBJS) -o $@
clean:
@rm -f $(OBJS) $(TARGET)
根据 FreeBSD make 文档,它不支持模式规则。所以你的规则是:
%.o: %.cpp
@echo compile $<
@$(CXX) -c $< -o $@
在 FreeBSD 中 make 只是一个明确的规则,告诉 make 如何从文字文件
%.o
构建文字文件 %.cpp
。由于您没有尝试构建名为 %.o
的文件(您正在尝试构建 main.o
),因此该规则将被忽略/从未使用。
如果您想要在两个版本的 make 之间以相同的方式工作,您必须将自己限制为 POSIX 标准后缀规则格式,如下所示:
.SUFFIXES: .cpp .o
.cpp.o:
@echo compile $<
@$(CXX) -c $< -o $@
默认的构建实用程序不同。 FreeBSD 使用与 GNU/Linux 不同的 make 实现。各自的手册页概述了差异。
https://forums.freebsd.org/threads/difference-gmake-gnu-and-freebsd-make.28784/