请注意,这不是其他名为通用makefile的问题的副本。
我已经遵循了有关通用make文件的其他问题的所有说明,这是我从中得出的代码:
CFLAGS = -c
CC = cc
SOURCES = $(wildcard *.cc)
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES))
EXEC = run
all: build clean
build: $(OBJECTS)
$(CC) $(OBJECTS) -o $(EXEC)
%.o: %.cc
$(CC) $(CFLAGS) $<
clean:
rm *.o
但是,当我使用目录中名为 test.cc
的文件执行make
时,它会给我以下错误:
cc -o run
cc: error: no input files
*** Error code 1
Stop.
make: stopped in /somewhere
请注意, 我使用的是 FreeBSD, make
和 cc
命令是操作系统附带的命令。
行
SOURCES = $(wildcard *.cc)
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES))
是GNU的make语法,不被FreeBSD的make
理解,它有自己的方言(特别是$(wildcard)
和$(patsubst)
)。如果你需要编写可移植到许多系统的makefile,要么要求gmake存在并使用GNUmakefiles,要么坚持POSIX make的特性。
您可以在 FreeBSD 上安装 GNU make (gmake
cd /usr/ports/devel/gmake
make install clean
在 FreeBSD 的make
中,你可以这样做:
SOURCES!= ls *.cc
OBJECTS = ${SOURCES:.cc=.o}
第一行使用变量赋值修饰符。展开该值并将其传递给 shell 执行,并将结果分配给变量。结果中的任何换行符都将替换为空格。这是一个非常强大的机制。例如,您应该使用 find
而不是 ls
在子目录中搜索;
SOURCES!= find . -type f -name '*.cc'
第二行使用变量修饰符来执行 AT&T System V UNIX 样式的变量替换。它将后缀 .cc
替换为.o
后缀。
FreeBSD 上的make
与 GMake 不同(大多数 Linux 系统上的命令make
),这些功能需要 GMake。改为gmake
运行命令。
我不熟悉哪些功能需要 GMake。