Gcc 带有Makefile的额外cflag

Gcc 带有Makefile的额外cflag,gcc,makefile,Gcc,Makefile,我正在阅读GTK+的基础知识,因此决定编写一个简单的makefile,让我运行“make”来编译我刚刚编写的示例程序。我还偶然发现了Gnome团队指定的编译器指令列表,这些指令将有助于从GTK2迁移到GTK3,因此我想包括这些指令 无论出于什么目的,我都是一个无名小卒,所以我想到的是: CC = gcc CFLAGS += -Wall GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECA

我正在阅读GTK+的基础知识,因此决定编写一个简单的makefile,让我运行“make”来编译我刚刚编写的示例程序。我还偶然发现了Gnome团队指定的编译器指令列表,这些指令将有助于从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 *~
CC=gcc
CFLAGS+=-墙
GTK_DFLAGS=-DGTK_DISABLE_SINGLE_INCLUDES-DGDK_DISABLE_DEPRECATED-DGTK_DISABLE_DEPRECATED-DGSEAL_ENABLE
GTK_CFLAGS=$(shell打包配置--CFLAGS GTK+-3.0)
GTK_LDFLAGS=$(shell包配置--libs GTK+-3.0)
%.o:%.c
$(CC)$(CFLAGS)$(GTK_DFLAGS)$(GTK_CFLAGS)-c-o$@$<
%:%
$(CC)$(CFLAGS)$(GTK_DFLAGS)$(GTK_CFLAGS)$(GTK_LDFLAGS)-o$@$<
.假冒:干净
清洁:
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
[patrick@blackboxch2]$make helloworld
gcc-Wall helloworld.c-o helloworld
helloworld.c:1:21:致命错误:gtk/gtk.h:没有这样的文件或目录
#包括
^
编译终止。
:目标“helloworld”的配方失败
make:**[helloworld]错误1
如果我将GTK_DFLAGS的内容简单地添加到CFLAGS的末尾,它们会出现在命令行上,但是pkg config变量仍然丢失


很明显,我把一些简单的事情搞糟了,但在一个小时含糊不清的谷歌搜索之后,我对它到底是什么完全没有概念。

你需要在你的Makefile中为
helloworld
设置一个目标。大概是这样的:

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

您需要在Makefile中为
helloworld
设置一个目标。大概是这样的:

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

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

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标志


感谢那些做出贡献的人

找到了答案,当然还有我在问这个问题/做早期搜索时丢失的词汇

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标志



感谢那些做出贡献的人

另外,我也很乐意指出我做错的任何事情我没有看到任何明显的错误。我建议在带有
$(shell…
的行中使用
:=
而不是
=
。如果出错,只会导致额外调用
pkg config
,这只是
make
期间的性能问题。不是导致这个问题的根本原因。啊哈。。。我知道发生了什么事。您的主要目标是
helloworld
,您直接从
helloworld.c
文件编译它,而不是链接
helloworld.o
文件。你的
helloworld
目标是什么样子的?这就是整个makefile,以及我调用的使用它的命令,哈哈。我感觉很快就有答案了;达尔索,我很乐意让别人指出我做错了什么我没有看到任何明显的错误。我建议在带有
$(shell…
的行中使用
:=
而不是
=
。如果出错,只会导致额外调用
pkg config
,这只是
make
期间的性能问题。不是导致这个问题的根本原因。啊哈。。。我知道发生了什么事。您的主要目标是
helloworld
,您直接从
helloworld.c
文件编译它,而不是链接
helloworld.o
文件。你的
helloworld
目标是什么样子的?这就是整个makefile,以及我调用的使用它的命令,哈哈。我感觉很快就有答案了;但如果我只想构建我提供给它的任何东西?例如,“make helloworld”使用提供的指令编译helloworld.c,但“make foo”将使用相同的指令编译foo.c。如果您的可执行文件只能从单个源文件生成,那么您的
%:%.o
规则似乎应该涵盖它。我的记忆在这里是模糊的,但我相信那些模式规则两边都需要一个后缀,这是规则所缺乏的。是的,我解决了它。我对宏的理解是错误的。请看下面我的答案。=)但如果我只是想建造我提供给它的任何东西?例如,“make helloworld”使用提供的指令编译helloworld.c,但“make foo”将使用相同的指令编译foo.c。如果您的可执行文件只能从单个源文件生成,那么您的
%:%.o
规则似乎应该涵盖它。我的记忆在这里是模糊的,但我相信那些模式规则两边都需要一个后缀,这是规则所缺乏的。是的,我解决了它。我对宏的理解是错误的。请看下面我的答案。=)您应该将规则编写为
%:%.c
。如果你没有给出一个先决条件,那么make在你修改源文件时将不会重建你的程序,这使得在第一时间使用makefile是没有用的。啊,真的!在make告诉我目标是最新的之后,我对我的makefile进行了更改,但是我忘了在这里进行更改。这样做!=)您应该将规则编写为
%:%.c
。如果你没有给出一个先决条件,那么make在你修改源文件时将不会重建你的程序,这使得在第一时间使用makefile是没有用的。啊,真的!我改变了我的生活