【问题标题】:extra CFLAGs with Makefile带有 Makefile 的额外 CFLAG
【发布时间】: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

标签: gcc makefile


【解决方案1】:

找到了答案,当然还有我在问这个问题/进行早期搜索时缺少的词汇。

CC           = gcc
CFLAGS      += -Wall -std=c11
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)

%: %.c
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o $* $*.c

.PHONY: clean

clean:
    rm -f *~

这就是我想要的,即将一个任何名称的单个 .c 文件编译成一个具有我想要使用的 GTK 标志的同名程序。

感谢贡献的人!

【讨论】:

  • 您应该将规则写为% : %.c。如果您不提供先决条件,那么当您修改源文件时,make 将不会重建您的程序,这使得首先使用 makefile 毫无用处。
  • 啊,果然!在 make 告诉我目标是最新的之后,我对我的 makefile 进行了更改,但是我忘记在此处进行更改。这样做! =)
【解决方案2】:

您需要在 Makefile 中为 helloworld 指定一个目标。像这样的:

helloworld: helloworld.o
    $(CC) -o helloworld helloworld.o $(LDFLAGS) $(GTK_LDFLAGS)

【讨论】:

  • 但是如果我只想构建我提供给它的任何东西?例如,“make helloworld”使用提供的指令编译 helloworld.c,但“make foo”将使用相同的指令编译 foo.c。
  • 如果您的可执行文件可以仅由单个源文件生成,那么您的%: %.o 规则似乎应该涵盖它。这里我的记忆很模糊,但我相信那些模式规则需要两边都有后缀,而这是规则所缺少的。
  • 是的,我解决了。我对宏的理解是错误的。请看下面我的回答。 =)
猜你喜欢
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2013-04-29
  • 1970-01-01
  • 2017-01-31
  • 2018-06-25
  • 1970-01-01
相关资源
最近更新 更多