Простой make-файл для целей C / C ++, используемый с arm-linux-gcc - PullRequest
5 голосов
/ 04 января 2012

Я бы хотел кросс-компилировать простую программу для архитектуры ARM, используя набор компиляторов arm-linux-gcc [arm-linux-gcc (Buildroot 2011.08) 4.3.6].Я попытался использовать простой make-файл для компиляции кода C и еще один простой make-файл для компиляции кода C ++.Например, мой make-файл для кода C воспроизводится ниже, но он не создает двоичный файл ELF для работы на моей встроенной системе.Хост-система - это x64 GNU Linux.

Вот список моего очень простого make-файла для программы на C:

CC=arm-linux-gcc
CFLAGS=-Wall
main: test.o 

clean:
    rm -f test test.o 

Воспроизведенный выше make-файл создает только объектный файл с расширением .o и не создает двоичный файл ELF..

Я нашел Google для хорошего решения, но я не могу найти ни одной веб-страницы, показывающей пример кросс-компиляции сборочных файлов ARM для программ на C и C ++.Возможно, ответ на этот пост может показать такие примеры.

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Ознакомьтесь с руководством по сборке GNU (info make), Раздел 10.2 . Он содержит каталог неявных правил, то есть правил, в которых вам не нужно явно указывать команды. Как и думал @GregHewgill, неявное правило «Связывание одного объектного файла» строит N из N.o, но имя должно совпадать. Следовательно, вы можете назвать ваш исполняемый файл как ваш объектный файл, в этом случае

test:

или (более стандартный, потому что он определяет цель all)

all : test

вполне достаточно. Вы также можете выписать правило в явном виде, как это описал Грег Хьюгилл. В этом случае стандартное правило:

 $(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS)

Включите LDFLAGS и LDLIBS в ваш Makefile, это облегчит жизнь пользователям.

(sic: я думаю, что LOADLIBES - это действительно LOADLIBS, и автор пропустил -o).

В целом, я бы порекомендовал autoconf и automake вместо файлов ручной сборки. Дает вам кучу возможностей Makefile для совсем небольшой работы.

3 голосов
/ 04 января 2012

Я попробовал ваш Makefile и изменил следующее:

test: test.o

После того, как это изменилось, он заработал и создал двоичный файл с именем test.Кажется, что существует неявное правило, которое знает, как связать whatever, если одна из его зависимостей whatever.o.

Другой способ - это явное перечисление правила:

main: test.o
        $(CC) -o $@ $$

При этом используются специальные макросы $@ (что означает target ) и $$ (что означает зависимости ).

...