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