Может ли gcc использовать несколько ядер при связывании?

Поэтому при компиляции тонны исходных файлов с помощью GCC можно использовать -j для использования всех доступных ядер. Но как насчет линкера? Есть ли аналогичная опция для ускорения связи или GCC не поддерживает многопоточность? В некоторых более крупных проектах это может занять некоторое время... (... и я ненавижу ждать!)

Изменить: Спасибо за указание, что -j - это опция make, а не gcc/g++. Но это не отвечает на мой вопрос! Я хотел бы знать, может ли gcc использовать многопоточность при связывании программы!

Ответ 1

Попробуйте gold, который был разработан Ян Лэнсом Тейлором и др. от Google и выпущен как часть пакета GNU binutils.

Из Википедии:

Мотивация для написания золота заключалась в том, чтобы сделать компоновщик быстрее, чем GNU-компоновщик, особенно для больших приложений, закодированных в С++

Я должен признать, что я еще не пробовал это сам, но он упомянул на веб-странице WebKitGTK.

Для получения дополнительной информации см. статью, написанную автором золота: Новый ELF-компоновщик.

Что еще более важно, см. работу по инкрементной/параллельной/параллельной компоновке Sander Mathijs van Veen под названием Параллельная связь с GNU Gold Linker и библиография в ней.

Ответ 2

Параметр -j, к которому вы обращаетесь, обрабатывается make not gcc.

Использование make -j n запрашивает make для запуска действий в Makefile с несколькими параллельными процессами (замените n на число. В случае процесса make -j 2 it 2).

Make выполняет большинство задач синхронизации при параллельных сборках.

Ответ 3

lld, компоновщик, разработанный проектом LLVM, по умолчанию будет использовать несколько ядер. Я также обнаружил, что это примерно в 2 раза быстрее, чем золото, работающее с несколькими потоками (-Wl,--threads -Wl,--thread-count,xxx)