2016-03-17 3 views
-1

У меня есть make-файл для проекта, где исполняемый файл чувствителен к производительности, и содержит много встроенных последовательностей asm, а также некоторый код C, который вызывает эти последовательности. Сейчас мы строим исполняемый перечисляя все файлы C в одной команде компиляции/ссылок, например:В чем разница между компиляцией/связыванием в одной команде и компиляцией/компоновкой в ​​отдельных командах?

gcc $(CFLAGS) $(LFLAGS) a.c b.c -o outfile 

Но это занимает много времени, чтобы произвести исполняемый файл.

Есть ли разница в производительности мудр в результате исполняемый (OUTFILE) для ломки ссылку компиляции &, как это:

gcc $(CFLAGS) -c a.c -o a.o 
gcc $(CFLAGS) -c b.c -o b.o 
gcc $(LFLAGS) a.o b.o -o outfile 

Эта скорость будет до сборки, потому что мы бы выполнить инкрементную сборку, и мы могли бы также использовать make -j для распараллеливания сборки.

BTW, мы используем gcc 5.1+.

+0

Возможно, вам захочется исследовать, какова идея make и make-файлов на самом деле. Подсказка: ваш первый вариант - это полная противоположность. И gcc не является компоновщиком или инструментом сборки. Ваш вопрос не связан с gcc- или C. – Olaf

+0

Спасибо, только что отредактирован. –

+0

Я думаю, что мой оригинальный пост был запутанным. Я только что отредактировал его. Исполняемый файл чувствителен к производительности (я не хочу изменять метод сборки, если он делает исполняемый файл медленнее). Я знаю, что могу улучшить скорость сборки, разбив сборку на отдельные шаги, но я не знаю, будет ли результирующий исполняемый файл работать медленнее. –

ответ

1

Здание, как в вашем первом примере, не использует , делает способностью восстановить только измененные файлы. Вы составляете всевсе время, затем ссылку.

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

В версии сборки, однако, где вы, как правило, можно ожидать, чтобы построить все(сделать чистый, сделать все), вы не могли бы ожидать увеличение производительности (вы все еще делать то же самое, что и первоначально), но может использовать make -j.

EDIT: После того, как вы изменили вопрос:

Нет, нет никакой разницы между строить методы с точки зрения полученного исполняемого файла. Фактически, два результирующих двоичных файла должны быть на 100% идентичны. Ваша первая строка gcc делает то же самое, что и make + gcc, с измененным make-файлом.

+0

Я думаю, что мой оригинальный пост был запутанным. Я только что отредактировал его. Исполняемый файл чувствителен к производительности (я не хочу изменять метод сборки, если он делает исполняемый файл медленнее).Я знаю, что могу улучшить скорость сборки, разбив сборку на отдельные шаги, но я не знаю, будет ли результирующий исполняемый файл работать медленнее. –

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