【问题标题】:Generic Makefile not working on FreeBSD通用 Makefile 在 FreeBSD 上不起作用
【发布时间】:2015-03-31 13:49:33
【问题描述】:

请注意,这不是其他名为 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

但是,当我在我的目录中使用名为 test.cc 的文件执行 make 时,它给了我以下错误:

cc    -o run
cc: error: no input files
*** Error code 1

Stop.
make: stopped in /somewhere

请注意,我使用的是 FreeBSD,make 和 cc 命令是操作系统自带的。

【问题讨论】:

  • 注意:如果 *.cc 文件包含 C++,您应该使用 C++ 编译器。 CC = cc 很可能是一个 C 编译器。

标签: makefile freebsd cc


【解决方案1】:

线条

SOURCES = $(wildcard *.cc)
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES))

是 GNU make 语法,FreeBSD 的 make 不理解,它有自己的方言(特别是 $(wildcard) 和 $(patsubst))。如果你需要编写可移植到许多系统的 makefile,要么要求 gmake 存在并使用 GNUmakefile,要么坚持features of POSIX make。

你可以在 FreeBSD 上安装 GNU make (gmake)

cd /usr/ports/devel/gmake
make install clean

【讨论】:

  • 这两行的freebsd版本是什么?
【解决方案2】:

在 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 后缀。

【讨论】:

    【解决方案3】:

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

    我不知道究竟哪些功能需要 GMake。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2015-01-11
      • 2016-11-17
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      相关资源
      最近更新 更多