5
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

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

编译时,我收到错误:

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

4 回答 4

3

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

于 2012-10-16T03:58:15.367 回答
1

出色地。我真的不能告诉你为什么会发生这种情况,但我可以重现它,并且我有一个解决方法——至少——可以为你节省一半的工作。

我正在使用 freebsd (9.0) 并且对局部变量具有完全相同的效果,无论我使用像 $<、$@ 这样的快捷方式(不再推荐 - 请参阅手册页)还是像 ${ 这样的“长”名称。目标}。我也尝试了不同的位置,但似乎总是一个本地变量被简单地忽略了。所以,如果你使用这个语句:

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

一切都编译得很好。我目前仍在尝试,但我猜您的代码不是在 freebsd 机器上创建的,因此部分 Makefile 和项目可能带有 gnu 设置,这有点混乱。

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

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

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

调用make -d A,查看 make 命令如何处理本地变量

问候吉米

于 2012-11-12T19:39:38.533 回答
0

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

于 2012-10-15T21:11:34.563 回答
-1

我无法重现您描述的现象。您的问题陈述不完整或您的版本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
于 2012-10-16T04:10:18.090 回答