WedX - журнал о программировании и компьютерных науках

Почему этот makefile не работает?

Я новичок в Makefiles, и я пытаюсь написать простой, который будет компилировать и связывать все приложения, перечисленные в такой переменной:

APPLICATIONS = app1 app2 app3

Все они должны иметь исходный файл (.c) и компилироваться с CFLAGS и LDFLAGS, которые я определяю в одном и том же Makefile, но по какой-то причине он не работает... Код основан на примере, найденном здесь (стр. 23).

APPLICATIONS = one two three

DESTDIR=/home/carles/Develop/xenomai-2.5.6

TOOLCHAIN = arm-linux-gnueabi-gcc

OBJDIR      := bin
OBJS        := $(addprefix $(OBJDIR)/,$(addsuffix .o,$(APPLICATIONS)))
INCLUDE_PATH = $(DESTDIR)/usr/xenomai/include
CFLAGS       = -I$(INCLUDE_PATH) -D_GNU_SOURCE -D_REENTRANT -D__XENO__ -Wall -pipe
POSIX_CFLAGS = -I$(INCLUDE_PATH)/posix
LIB_PATH     = $(DESTDIR)/usr/xenomai/lib
LIBRARIES    = -lnative -lxenomai -lpthread -lrtdk -lrt
LDFLAGS      = $(LIBRARIES) -L$(LIB_PATH)
POSIX_LDFLAGS= -Wl,@$(LIB_PATH)/posix.wrappers -lnative -lpthread_rt -lxenomai -lpthread -lrt -L$(LIB_PATH) 


$(OBJDIR)/%.o : %.c
    @printf '------------------: $< -> $@ : '
    if [ $(TOOLCHAIN) $< -o $(OBJDIR)/$@ $(CFLAGS) $(LDFLAGS) -L$(LIB_PATH) ]
    then
        @echo 'done!'
    fi

all: $(OBJS) | show_config

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir -p $(OBJDIR)

show_config:
    @echo '------------------: APPLICATIONS : $(APPLICATIONS)'
    @echo '------------------: DESTDIR      : $(DESTDIR)'
    @echo '------------------: INCLUDE PATH : $(INCLUDE_PATH)'
    @echo '------------------: LIB. PATH    : $(LIB_PATH)'
    @echo '------------------: TOOLCHAIN    : $(TOOLCHAIN)'
    @echo '------------------: LIBRARIES    : $(LIBRARIES)'
    @echo '------------------: OBJS         : $(OBJS)'

clean:
    @rm $(OBJDIR) -r -f

Когда я запускаю $ make, создается только каталог и вызывается show_config, но объектные файлы не создаются и ошибка не отображается. Что здесь не так?

12.04.2013

Ответы:


1

У вас есть два правила:

$(OBJDIR)/%.o : %.c
    ...

$(OBJS): | $(OBJDIR)

Первое правило шаблона, второе обычное правило. Обычно они могут работать вместе, но если исходные файлы (one.c, two.c, three.c`) не существуют, то первое правило не применяется, второе требует создания каталога, и это все, что вы получаете. . Вы также можете объединить их:

$(OBJDIR)/%.o : %.c | $(OBJDIR)
    ...

или еще лучше:

$(OBJS): $(OBJDIR)/%.o : %.c | $(OBJDIR)
    ...

Как только вы это исправите, вы заметите другую проблему. Команды в этом правиле:

$(OBJDIR)/%.o : %.c
    @printf '------------------: $< -> $@ : '
    if [ $(TOOLCHAIN) $< -o $(OBJDIR)/$@ $(CFLAGS) $(LDFLAGS) -L$(LIB_PATH) ]
    then
        @echo 'done!'
    fi

не делай того, что, как ты думаешь, они делают. Первый (@printf ...) будет работать, если printf работает в вашей оболочке; вы должны проверить это, и если это не так, попробуйте вместо этого @echo .... Следующие четыре строки явно предназначены для совместной работы. Но в правиле Make каждая строка является командой сама по себе, работающей в своей собственной подоболочке, поэтому эта структура не будет работать. Вы можете поместить все это в одну строку:

    if [ $(TOOLCHAIN) ... ]; then @echo 'done!'; fi

(Обратите внимание на точку с запятой.) Это длинная строка, поэтому, если она утомительна для глаз, вы можете разделить ее, используя обратную косую черту для обозначения продолжения строки:

    if [ $(TOOLCHAIN) $< -o $(OBJDIR)/$@ $(CFLAGS) $(LDFLAGS) -L$(LIB_PATH) ]; \
  then \
    @echo 'done!'; \
  fi

(Обратите внимание, что требуется только одна TAB перед if.)

12.04.2013

2

Это не работает, потому что файлы one.c, two.c, three.c не существовали и, следовательно, их не нужно было создавать.

12.04.2013
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]