【发布时间】:2020-03-28 09:45:31
【问题描述】:
当我运行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
Makefile 看起来像这样:
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。
在我看来,问题出在$? 变量kindly described here 上。在第一次运行时,它似乎只解析为../project42.c 而不是../csvparser.c ../nxjson.c ../project42.c。
我的怀疑是我有一些东西出了问题,并且在第一次运行时被缓存,但只有在需要它之后。
我需要在 Makefile 中进行哪些更改才能使编译第一次工作?我是否需要先移动 -L (LIBDIRS) 部分?
【问题讨论】: