0

我有这个文件夹/文件结构:

./libs/
    helpers.c
    helpers.h
./a_app.c
./b_app.c
./c_app.c

每个应用程序都依赖于 helpers lib 和GStreamer,所以我需要编译helpers.o(在libs/文件夹内)然后链接每个应用程序。

目前我有这个Makefile:

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`
LFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`

LDFLAGS =
LDFLAGS +=  `pkg-config --libs gstreamer-app-0.10`

all: examples

examples: helpers.o a_app
    $(info *** examples ***)

helpers.o:
    $(info *** helpers.o ***)
    $(CC) $(LFLAGS) libs/helpers.c -o libs/helpers.o $(LDFLAGS)

a_app: a_app.o
    $(CC) $(CFLAGS) libs/helpers.o a_app.o -o a_app $(LDFLAGS)

a_app.o: a_app.c
    $(info *** a_app.o ***)
    $(CC) $(LFLAGS) a_app.c $(LDFLAGS)

虽然我可以添加b_app并且c_app我正在寻找另一种(更优雅)的方式。我不能只说我有 a、b 和 c _app 并让 Makefile 将它们全部编译并将它们与 GStreamer 和助手链接吗?

此外,有没有什么方法可以让 Makefile 编译文件而不需要告诉它-o name_of_file(并且可能让它在它们所在的文件夹中编译它们,因为有帮助程序库)。

4

1 回答 1

2

好的,所以 - 正如我们在评论中讨论的那样,make 可以弄清楚如何制作 .o 文件,因此这些规则是不必要的。要为所有 *_app 文件制定通用规则(假设它们都对 helpers.h 具有相同的依赖关系,您可以这样做:

%_app: %_app.o libs/helpers.o

Make 使用 % 作为通配符,在规则/依赖行中,通配符将在依赖项中扩展为与规则中相同的内容。在实际执行中,可以使用$*来获取相同的字符串。因此,所有 *_app 可执行文件的单一规则最终看起来有点像这样:

%_app: %_app.o libs/helpers.o
    $(CC) $(CFLAGS) libs/helpers.o $*_app.o -o $*_app $(LDFLAGS)

我在我的机器上测试这个(因此评论而不是答案,最后写了这个 Makefile:

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`
LFLAGS  +=  `pkg-config --cflags gstreamer-app-0.10`

LDFLAGS =
LDFLAGS +=  `pkg-config --libs gstreamer-app-0.10`

new: clean all

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

all: examples

examples: a_app b_app

%_app: %_app.o libs/helpers.o
    $(CC) $(CFLAGS) libs/helpers.o $*_app.o -o $*_app $(LDFLAGS)

这一切有意义吗?

编辑:我突然想到 GNU Make 可以在命令行上运行一些命令并为自己的目的存储字符串。

$(shell ls *_app.c | sed 's/.c//') 将扩展到您在当前目录中拥有的所有应用程序。所以你可以说:

examples: $(shell ls *_app.c | sed 's/\.c//')

或者,我认为更好一点:

...
ALLAPPS = $(shell ls *_app.c | sed 's/\.c//')
...
all: $(ALLAPPS)

这种方式make可以用来制作所有东西,并且make ?_app可以用来一次编译一个应用程序。

超级超级超级双编辑:

使用 bald%运算符作为目标将破坏 Make 自动生成 .o 文件的能力。这是我们在聊天中制定的解决方案:

CC      =   gcc
CFLAGS  =   -g -Wall -w
LFLAGS  =   -g -Wall -w -c

CFLAGS  +=  $(shell pkg-config --cflags gstreamer-app-0.10)
LFLAGS  +=  $(shell pkg-config --cflags gstreamer-app-0.10)

LDFLAGS =
LDFLAGS +=  $(shell pkg-config --libs gstreamer-app-0.10)

TARGETS = $(shell ls *.c | sed 's/\.c//')

new: clean all

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

all: examples

examples: $(TARGETS)

.SECONDEXPANSION:
$(TARGETS): libs/helpers.o $$@.o
$(CC) $(CFLAGS) libs/helpers.o $@.o -o $@ $(LDFLAGS)
于 2013-03-19T12:25:48.640 回答