2016-03-15 3 views
0

Я пытаюсь создать пример приложения Atmel BitCloud v3.2 Blink с makefile в Linux и Mac. Все отлично работает в Windows. Но в Posix-подобных системах следующие строки не работают:Правило Makefile не выполняется в Linux

all: directories images root_files size 
$(OBJ_PATH)/%.o: $(SRCS) 
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir [email protected])), $(SRCS)) -o [email protected] 

Поэтому компилятор не выполняется и объектные файлы не создаются. В результате сообщения компоновщика отображается сообщение об ошибке, таких как

avr-gcc: error: All_MegaRf_Atmega256rfr2_8Mhz_Gcc/Obj/blink.o: No such file or directory

Линия $(OBJ_PATH)/%.o: $(SRCS) является источником проблемы.

Если я заменил его на smth, как $(OBJ_PATH)/blink.o: ../../src/blink.c, соответствующий объект-файл успешно создан.

я даже смог построить целое приложение, установив вручную строить цели следующим образом:

$(OBJ_PATH)/blink.o: ../../src/blink.c 
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir [email protected])), $(SRCS)) -o [email protected] 
$(OBJ_PATH)/stdPdsEvents.o: ../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsEvents.c 
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir [email protected])), $(SRCS)) -o [email protected] 

для всех .c файлов в проекте.

Список источников, с другой стороны, определяется следующим образом:

SRCS = \ 
../../src/blink.c \ 
../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsMemAccess.c \ 
../../../../BitCloud/Components/PersistDataServer/std/src/stdPdsTimer.c \ 

Может кто-нибудь помочь мне выяснить, почему сопрягает шаблон не работает и как его восстановить.

Примечание: подобная тема уже была открыта here, но решение, найденное автором самого автора, на мой взгляд не было хорошо объяснено, поэтому я не смог решить свою проблему.

+0

@ MichaëlAzevedo: Ваше последнее редактирование, похоже, удалило семантически важные пробелы. Пожалуйста, воздержитесь от редактирования кода на незнакомых вами языках. Благодарю. – tripleee

+0

@tripleee Мой плохой, я пытался заменить рюкзаки с помощью отступов кода. Должен ли я вернуться к предыдущей? –

+0

@ MichaëlAzevedo Нет необходимости; Я уже восстановил потерянные вкладки. Спасибо, что так быстро ответил. – tripleee

ответ

0

Конструкцию, чтобы каждый объектный файл зависит от всех исходных файлов и затем шаговый сборника рыбы фактически полезный файл из списка источников весьма сомнителен. Лучше было бы, чтобы сгенерировать Makefile фрагмент кода и включить его, что-то вроде этого:

makefile.d: 
    echo "$(SRCS)" \ 
    | tr ' ' '\n' \ 
    | sed -n 's%\(.*\)/\([^/]*\)\.c$$%$(OBJ_PATH)/\2.o: \1/\2.c%p' >[email protected] 
include makefile.d 

Все детали sed не правильно стандартизированы, так что вы можете быть лучше переписывания замену в Perl или что-то. Говядина здесь заключается в том, как мы фиксируем путь и базовое имя и генерируем конкретное правило для каждой зависимости.

0

Удалось решить наконец. Для того, чтобы сделать его компиляции и в Windows, и Linux, следует изменить Makefile, как показано ниже:

objects := $(patsubst %.c,$(OBJ_PATH)/%.o,$(notdir $(SRCS))) 
$(objects): $(SRCS) 
#$(OBJ_PATH)/%.o: $(SRCS) 
    $(CC) $(CFLAGS) $(filter %/$(subst .o,.c,$(notdir [email protected])), $(SRCS)) -o [email protected] 

где $(OBJ_PATH)/%.o: $(SRCS) должны быть прокомментированы или удалены. После этого проект можно построить под Linux или Mac и под окнами как в Atmel Studio 6.2, так и Atmel Studio 7. Последний не смог построить, как это было невозможно в Linux или Mac.

 Смежные вопросы

  • Нет связанных вопросов^_^