通用的 Makefile 在 FreeBSD 上不起作用



请注意,这不是其他名为通用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, makecc 命令是操作系统附带的命令。

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。

相关内容

  • 没有找到相关文章

最新更新