【发布时间】:2013-12-08 03:25:32
【问题描述】:
我正在阅读 GTK+ 的基础,因此决定编写一个简单的 makefile,让我运行“make”来编译我刚刚编写的示例程序。我还偶然发现了 Gnome 团队指定的编译器指令列表 here 将帮助从 GTK2 迁移到 GTK3,所以我想包括这些。
无论出于何种意图和目的,我都是一个新手,所以这就是我想出的:
CC = gcc
CFLAGS += -Wall
GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE
GTK_CFLAGS = $(shell pkg-config --cflags gtk+-3.0)
GTK_LDFLAGS = $(shell pkg-config --libs gtk+-3.0)
%.o: %.c
$(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) -c -o $@ $<
%: %.o
$(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o $@ $<
.PHONY: clean
clean:
rm -f *.o *~
您可能会猜到,它的工作原理并不完全正确。我知道从 makefile 内部运行 pkg-config 并不是一个理想的解决方案,但这适用于我的小型学习项目,而不适用于任何类型的部署。也就是说,输出对我来说很奇怪;似乎 make 只是忽略了 CFLAGS 之后的任何变量。
类似:
[patrick@blackbox ch2]$ make helloworld
gcc -Wall helloworld.c -o helloworld
helloworld.c:1:21: fatal error: gtk/gtk.h: No such file or directory
#include <gtk/gtk.h>
^
compilation terminated.
<builtin>: recipe for target 'helloworld' failed
make: *** [helloworld] Error 1
如果我将 GTK_DFLAGS 的内容简单地添加到 CFLAGS 的末尾,它们会出现在命令行上,但 pkg-config 变量仍然丢失。
对我来说很明显我把一些简单的事情搞砸了,但是在用一个小时含糊不清的谷歌搜索之后,我对它是什么一无所知。
【问题讨论】:
-
另外,我很乐意指出我做错了什么else。 =)
-
我没有看到任何明显的错误。我建议在
$(shell ...)的行上使用:=而不是=。但是,弄错只会导致对pkg-config的额外调用,这只是make期间的性能问题。不是导致此问题的根本原因。 -
啊哈...我明白发生了什么。您的主要目标是
helloworld,您直接从helloworld.c文件编译它,而不是链接helloworld.o文件。你的helloworld目标是什么样的? -
这就是整个makefile,以及我调用它来使用它的命令,哈哈。我感觉到答案很快就来了。 ;D