Когда я запускаю 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
.
На мой взгляд, проблема связана с переменной $?
, любезно описанной здесь. При первом запуске кажется, что разрешается только ../project42.c
, а не ../csvparser.c ../nxjson.c ../project42.c
.
Я подозреваю, что у меня что-то вышло из строя, и это кешируется во время первого запуска, но только ПОСЛЕ того, как это необходимо.
Что мне нужно изменить в Makefile, чтобы компиляция заработала в первый раз? Мне нужно переместить часть -L
(LIBDIRS) перед чем-то другим?