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发布于 2012-10-16 11:58:15
你确定你使用的是GNU make吗?您编写的代码将按照您在GNU make中的预期工作。但是,make的其他版本不支持显式规则中的自动变量,仅支持后缀(隐式)规则中的自动变量。例如,如果您使用的是SunOS/Solaris make,那么在显式规则中,$<将为空。
发布于 2012-11-13 03:39:39
井。我真的不能告诉你为什么会发生这种情况,但我可以重现它,我有一个解决办法-至少-节省了你一半的工作。
我使用的是FreeBSD9.0,无论我是使用$<、$@ (不再推荐使用)这样的快捷方式,还是使用${.TARGET}这样的“长”名称,对本地变量都有完全相同的效果。我也尝试了不同的位置,但似乎总是有一个局部变量被简单地忽略了。因此,如果您使用以下语句:
libstring.so: libstring.o
$(CC) -fPIC -shared libstring.o -o $@一切都编译得很好。我目前还在尝试,但我猜你的代码不是在freebsd机器上创建的,所以Makefile和项目的某些部分可能带有gnu设置,这会使这一点变得有点混乱。
关于我上面提到的'one‘,我在这里有一些Makefiles,其中添加另一个不同的变量(例如$^)也会导致工作条目。如下所示:
libstring.so: libstring.o
$(CC) -fPIC -shared $< -o $@ $^我仍然在做这件事,因为我正在从linux移植到freebsd,所以也许我找到了最后一点。但我的猜测是,它不是“原始的”freebsd源代码,所以Makefile语法也不是。
调用make -d A,查看make命令如何处理本地变量
问候吉米
发布于 2012-10-16 05:11:35
在这种情况下,您可能需要$^。$^是所有先决条件的列表,而$<是最近比目标更新更改的单个先决条件。
https://stackoverflow.com/questions/12904011
复制相似问题