Generic Makefile无法在FreeBSD上运行

时间:2015-02-01 14:30:51

标签: makefile freebsd cc

请注意,这与名为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上,makecc命令是操作系统附带的命令。

3 个答案:

答案 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)

FreeBSD上的

make与大多数Linux系统上的GMake(make命令)不同,这些功能需要GMake。改为运行命令gmake

我不熟悉哪些功能需要GMake。