当我运行make
时,第一次运行总是失败并显示Error 1
,但第二次运行按预期编译。
第一次运行将生成以下命令:
cc -g -I../../../../include -I../../../../include/sdk/ctree.ctdb/multithreaded/static -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -ldl -o ../project42 ../project42.c -L../../../../lib/ctree.ctdb/multithreaded/static -lmtclient -lpthread -ldl -lm -lglib-2.0
第二次运行生成以下命令(请注意包含 csvparser.c 和 nxjson.c(:
cc -g -I../../../../include -I../../../../include/sdk/ctree.ctdb/multithreaded/static -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -ldl -o ../project42 ../csvparser.c ../nxjson.c ../project42.c -L../../../../lib/ctree.ctdb/multithreaded/static -lmtclient -lpthread -ldl -lm -lglib-2.0
生成文件如下所示:
ACEBASEDIR=../../../..
APIDIR=ctree.ctdb/multithreaded/static
GLIBINC=$(shell pkg-config --cflags glib-2.0 | xargs)
INCDIRS=-I$(ACEBASEDIR)/include -I$(ACEBASEDIR)/include/sdk/$(APIDIR) $(GLIBINC)
CFLAGS=-g $(INCDIRS) -ldl -o $@
LIBDIRS=-L$(ACEBASEDIR)/lib/$(APIDIR)
SYSLIBS=-lpthread -ldl -lm -lglib-2.0
SRCDIR=..
OUTDIR=..
$(OUTDIR)/project42: $(SRCDIR)/csvparser.c $(SRCDIR)/nxjson.c $(SRCDIR)/project42.c
cc $(CFLAGS) $? $(LIBDIRS) -lmtclient $(SYSLIBS)
clean:
rm -f $(OUTDIR)/project42
当我展开命令时,我得到这个:
cc -g -I../../../../include -I../../../../include/sdk/ctree.ctdb/multithreaded/static $(shell pkg-config --cflags glib-2.0 | xargs) -ldl -o $@ $? -L../../../../lib/ctree.ctdb/multithreaded/static -lmtclient -lpthread -ldl -lm -lglib-2.0
运行pkg-config --cflags glib-2.0 | xargs
返回-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include
。
对我来说,问题似乎出在这里描述的$?
变量上。 在第一次运行时,它似乎只决心../project42.c
而不是../csvparser.c ../nxjson.c ../project42.c
。
我怀疑我有一些乱序的东西,并且在第一次运行时被缓存,但只有在需要它之后。
我需要在生成文件中更改什么才能使编译首次工作? 我是否需要先移动-L
(LIBDIRS( 部分,然后再进行其他操作?
不要使用$?
. 这将扩展到比目标更新的文件列表。 您不能仅从更改的文件构建可执行文件:您必须从所有文件构建它。
您想改用此处的$^
。
实际上,给定此makefile使用make
是没有意义的;它每次都运行相同的内容,除非根本没有对任何源文件进行任何更改。 你所拥有的几乎比shell脚本好不了多少。