Компилятор ARM GNU -j [задания] существует

Я не могу найти вариант для инструментальной цепочки ARM GNU для одновременной компиляции нескольких файлов c. Я все время использую make -j5 при компиляции с использованием gcc. Помогает значительно ускорить время компиляции. Было бы хорошо, если бы у ARM GNU была подобная опция.

Вот моя установка: --Fedora 20 - Core i5 --Eclipse с плагином ARM GNU --ARM GNU 4.8-2014-q1-update (отсюда: https://launchpad.net/gcc-arm-embedded) - ИБП цели: STM32F205RB

Я безуспешно пытался заставить работать CodeSourcery GCC. После небольшой настройки казалось, что ARM GNU работает хорошо. CodeSourcery GCC должен иметь параметр -j, поскольку мы постоянно выполняем кросс-компиляцию для встроенного Linux.


person Dashoveler    schedule 10.05.2014    source источник
comment
Позаботьтесь о компиляции цепочек инструментов, используя параметр -j. У них могут быть неинтуитивные зависимости с несколькими пакетами!   -  person πάντα ῥεῖ    schedule 10.05.2014
comment
Эм-м-м? make и компилятор - это две ортогональные концепции ...   -  person Marc Glisse    schedule 10.05.2014


Ответы (1)


GCC не является многопоточным. Переключатель -j<n> относится к make системе сборки, а не компилятору. Он сообщает make, сколько задач может выполняться параллельно.

Если вы запустите make -j4, вы увидите в своем диспетчере задач / топ / списке процессов, что он пытается запустить 4 экземпляра GCC, компилируя 4 независимых *.c файла одновременно.

Чтобы использовать команду -j, у вас должен быть Makefile в вашем проекте, которому она может быть полезна. У него должно быть несколько независимых целей, чтобы их можно было запускать параллельно.

Если вы запутались в терминологии, я советую вам посмотреть make учебник, например этот: http://mrbook.org/tutorials/make/

Обычная стратегия здесь - иметь отдельную цель для каждого c или cpp файла в нашем проекте. Таким образом make может легко порождать несколько процессов компилятора для каждой единицы компиляции. После создания всех файлов * .o они связываются.

Давайте посмотрим на этот пример фрагмента:

SRCS  := main.c func.c other.c another_file.c ...
OBJS  := $(SRCS:.c=.o)

objects: $(OBJS)

%.o: %.c
  gcc -o $(@) -c $(<)

Мы передаем список c файлов, меняем их на соответствующий o файл, используя подстановку суффиксов, и рассматриваем список *.o файлов как цели. Теперь make может компилировать каждый c файл параллельно.

Напротив, если мы сделаем что-то вроде этого:

SRCS  := main.c func.c other.c another_file.c ...

all:
  gcc $(SRCS) -o a.out

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

person ezaquarii    schedule 10.05.2014
comment
Спасибо! Я как раз собирался написать, что я тупой, потому что это система make, а не gcc - person Dashoveler; 10.05.2014
comment
Для тех, кто пытается сделать это в eclipse, выполните следующие действия: 1. Перейдите к: Project- ›Properties-› c / c ++ Build- ›Builder Settings 2. снимите флажок использовать команду сборки по умолчанию 3. Добавьте -j5 к команде сборки (или -jX, X обычно - это # ​​ядер, которые у вас есть +1) Обычно это сработает, если ваша программа make поддерживает многопоточную компиляцию. На моей машине с диском это не имело большого значения, но на моей машине с твердотельным накопителем он компилировался за 1/3 времени. - person Dashoveler; 13.05.2014