C语言 Linux make 在第一次运行时失败,在第二次运行时成功



当我运行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脚本好不了多少。

相关内容

  • 没有找到相关文章

最新更新