bmake:正确使用自动变量

时间:2012-10-15 21:08:16

标签: c makefile

CC = gcc
CFLAGS = -std=c99 -Werror
VPATH = ./src:./include

.MAIN: libstring.so
.PHONY: clean

libstring.o: libstring.c libstring.h
    $(CC) $(CFLAGS) -c $< -I ./include -o $@

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@

clean:
    rm -rf ./*.o ./*.so

在上面的代码片段中,我特别感兴趣的是我是否正确使用<自动变量。如果源/先决条件是c源文件,但对于目标文件似乎失败,则此方法有效。

编译时,我收到错误:

gcc -fPIC -shared  -o libstring.so
gcc: No input files specified

4 个答案:

答案 0 :(得分:3)

确定你正在使用GNU make吗?您编写的代码将按照您在GNU make中的预期工作。但是,其他版本的make不支持显式规则中的自动变量,仅支持后缀(隐式)规则。例如,如果您正在使用SunOS / Solaris make,那么$<在显式规则上将为空。

答案 1 :(得分:1)

好。我真的告诉​​你为什么会这样,但我可以重现它,我有一个解决方法 - 至少 - 为你节省了一半的工作。

我正在使用freebsd(9.0)并且对局部变量具有完全相同的效果,无论我是否使用快捷键如$&lt;,$ @(不再推荐使用 - 请参阅联机帮助页)或'long'像$ {。TARGET}这样的名字。我也尝试过不同的职位,但似乎总是有一个本地变量被忽略了。 所以,如果你使用这个陈述:

libstring.so: libstring.o
    $(CC) -fPIC -shared libstring.o -o $@

一切都很好。我目前还在尝试,但我猜你的代码不是在freebsd机器上创建的,因此Makefile和项目的部分内容可能会带有gnu设置,这会让你有点烦恼。

关于我上面提到的'one',我在这里有一些Makefile,其中添加另一个不同的变量(例如$ ^)也导致了工作条目。像这样:

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@ $^

我还在,因为我从linux移植到freebsd很多,所以也许我找到了最后一点。但我的猜测是,它不是'原创'的freebsd源,所以Makefile语法也不是。

致电 制作-d A ,了解make命令如何处理您的本地变量

问候 麦

答案 2 :(得分:0)

在这种情况下,你可能想要$^$^是所有先决条件的列表,而$<是比目标更新的单个先决条件。

答案 3 :(得分:0)

我无法再现你描述的现象。您的问题陈述不完整或您的make版本有错误。

brian@hplaptop:~/src/so/mk$ echo 'int foo;' > libstring.c
brian@hplaptop:~/src/so/mk$ cat Makefile

all: libstring.so

libstring.so: libstring.o
    $(CC) -fPIC -shared $< -o $@

brian@hplaptop:~/src/so/mk$ make
cc    -c -o libstring.o libstring.c
cc -fPIC -shared libstring.o -o libstring.so
brian@hplaptop:~/src/so/mk$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-pc-linux-gnu