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
-j
. У них могут быть неинтуитивные зависимости с несколькими пакетами! - person πάντα ῥεῖ   schedule 10.05.2014