Компиляция C-файла с зависимостями файла на Ассемблере - PullRequest
1 голос
/ 28 января 2011

У меня есть файл app.c, который выполняет вызовы двух внешних функций, т.е. func_asm1 и func_asm2. Обе функции находятся в отдельном файле ассемблера, т.е. func_asm1.S и func_asm2.S. Более того, У меня есть два заголовочных файла, т.е. func_asm1.h и func_asm2.h, где определены интерфейсы двух функций ассемблера:

extern void func_asm1(unsigned int *r, const unsigned int *a);

Основной файл app.c включает два заголовка: func_asm1.h и func_asm2.h, мой файл make. выглядит на данный момент следующим образом, но я не работаю ... Кто-нибудь идея, что может быть не так?

CC  = bin/arm-elf-gcc
AS  = bin/arm-elf-as
SFLAGS=-S -O2

func_asm1.o: func_asm1.S
    $(AS) -o $@ $< 

func_asm2.o: func_asm2.S
    $(AS) -o $@ $<

app.o: app.c app.h func_asm1.h func_asm2.h
    $(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o

Большое спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 28 января 2011

Я думаю, что ваш make-файл имеет неправильные зависимости:

Последняя часть должна выглядеть примерно так:

func_asm1.o: func_asm1.S
$(AS) -o $@ $< 

func_asm2.o: func_asm2.S
$(AS) -o $@ $<

app: app.c app.h func_asm1.h func_asm2.h func_asm1.o func_asm2.o
$(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o

Почему?Поскольку func_asm1.o и func2.o зависят от их исходного кода (я предполагаю, что вы не используете func_asm.h в исходном коде ассемблера). С другой стороны, app.o зависит от его исходного кода (app.c),его заголовочные файлы (app.h, func_asm1.h и func_asm2.h) и объектный код для файлов сборки.Обратите внимание, что вы компилируете И , связывая эту часть make-файла, поэтому, если объектный код для файлов сборки изменяется, вам необходимо заново связать приложение и, следовательно, выполнить эти строки.

Как яКак уже отмечалось в комментариях, вы должны проверить параметры, переданные в gcc (флаг -S передан в SFLAGS)

1 голос
/ 28 января 2011

Опция -S указывает gcc генерировать вывод ассемблера, а не объект, а это не то, что вам нужно.

Когда вы используете gcc, просто передайте файлы ассемблера в gcc:

.S.o:
    $(CC) $(ASFLAGS) -o $@ -c $<

.c.o:
    $(CC) $(CFLAGS) -o $@ -c $<

app: app.o func_asm1.o func_asm2.o
    $(CC) $(LDFLAGS) -o $@ $^

Для отслеживания зависимостей я бы расширил два правила компиляции с помощью -MD -MP и включил сгенерированные файлы * .d в мой Makefile, а не явно указывал заголовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...