【问题标题】:Trouble creating a generic make file创建通用 make 文件时遇到问题
【发布时间】:2014-02-05 20:16:18
【问题描述】:

嘿,所以我对 makefile 有点陌生,我正在尝试制作一个通用的 makefile,它将编译当前目录中以 .c 结尾的任何文件,而不是为项目专门命名的文件。我搜索了几个地方,重新阅读了我的讲义,尝试了一些更改,但我似乎无法让它发挥作用。这是我所拥有的:

CFLAGS= -Wall -g -o
%.o : %.c
        gcc ${CFLAGS} .c $<

这是我尝试运行时不断收到的错误:

make: *** No targets.  Stop.

我真的很感激任何帮助,我真的很讨厌一遍又一遍地输入gcc! 该文件名为Makefile

【问题讨论】:

  • 您“尝试运行”时输入的确切命令行是什么?
  • 我只输入“make”(不带引号)
  • @Karysto 仅供参考:你看过CMake吗?
  • 不,但我现在会,感谢大家的帮助。我真的很喜欢这个乐于助人的社区。​​span>

标签: c makefile


【解决方案1】:

一个通用的makefile,它将编译当前目录中任何以.c结尾的文件

这是make 的非典型用法,但可以使用 GNU make 的文本函数来完成:

SOURCES = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SOURCES))
all: $(OBJS)

如果您的目录中有foo.cbar.c,运行make 将产生foo.obar.o

如果您希望命令 make 编译并将每个 .c 链接到可执行文件中,请尝试:

SOURCES = $(wildcard *.c)
EXECS = $(patsubst %.c,%,$(SOURCES))
all: $(EXECS)

比较典型的,就是想编译链接单个程序。在这种情况下,您不需要任何 makefile,只需运行以下命令:

make foo
make bar

【讨论】:

  • 其实我只试了make myTest.c,得到了和上面一样的输出,make: Nothing to be done for myTest.c'。目前。
  • 天哪,第二个代码块起作用了……正是我需要的。我打算更多地使用通配符,非常感谢!
  • @Karysto 您应该阅读更多关于使用 makefile 的内容。很高兴你得到它。
【解决方案2】:

wildcard函数可以用来编译目录下所有的C源文件,然后链接在一起。

CFLAGS= -Wall -g -o
SRC=$(wildcard *.c)
foo: $(SRC)
    gcc -o $@ $^ $(CFLAGS)

【讨论】:

  • 那不会只编译 hello.c 吗?我从未见过带有 $(EXEC) 的倒数第二个代码块
【解决方案3】:

您有几个语法错误,您的 makefile 构建了对象,但没有将对象链接到可执行文件中。

myTest.c:

int main()
{
    return 0;
}

如果您的源文件是“myTest.c”,则生成文件:

CFLAGS= -Wall -g

all: myTest

myTest: myTest.o
    gcc $(CFLAGS) $< -o $@

%.o : %.c
    gcc $(CFLAGS) -c $<

使用构建

make myTest
gcc -Wall -g -c myTest.c
gcc -Wall -g myTest.o -o myTest

【讨论】:

  • 第三行之后的每一行都是多余的——这些规则是默认提供的。
  • 我要如何只用前三行教提问者有关 makefile 的知识?
  • 嘿,感谢所有快速回答!我在 Bash 中尝试了上面的代码,得到以下结果: $> make myTest.c $> Makefile:6: *** missing separator. Stop.
  • 在缩进的行上,确保有一个制表符而不是空格。还要输入“make myTest”而不是“make myTest.c”
  • 是的,我刚刚添加了标签(菜鸟错误),得到了这个输出:make: Nothing to be done for myTest.c'。`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多