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