Может ли 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
)