Советы по сокращению времени связывания С++
У меня есть проект, который занимает около 8 секунд для связи с g++ и ld.
Он использует кучу статических библиотек, большая часть кода - С++.
Мне интересен общий список советов о том, как сократить время ссылки.
Все, что угодно: "не включать символы отладки", чтобы "сделать ваш код менее спагетти"
Ответы
Ответ 1
Я занимался этим в течение многих лет на предыдущей работе. Утилита GNU просто имеет серьезные проблемы с производительностью при связывании большого количества статических библиотек. В какой-то момент время соединения было наравне с временем компиляции, которое мы обнаружили настолько странным, что мы действительно исследовали это и выяснили.
Перед связыванием вы можете попытаться объединить ваши статические библиотеки в "супер-объект". Вместо ссылки:
$ g++ -o program program.o $STATIC_LIBS
Вы можете попробовать следующее:
$ ld -r -o libraries.o --whole-archive $STATIC_LIBS
$ g++ -o program program.o libraries.o
Обратите внимание, что этот метод дает компоновщику меньше возможности исключить неиспользуемый объектный код, поэтому ваши двоичные файлы могут немного увеличиться.
Ответ 2
8 секунд довольно быстро, если вы не уверены, что это не займет столько времени. У меня есть проекты, которые занимают 5-8 минут для полного релинка, поскольку мы не делаем инкрементной привязки к нашим выпускам. Вы пытались использовать инкрементную привязку (если вы не используете -shared
, вы можете использовать -i
или -r
)?
Ответ 3
Отключите оптимизацию всей программы (по крайней мере, во время разработки). Используйте p-impl для сокращения зависимостей.
Ответ 4
создать ramdisk, скомпилировать его и связать с жестким диском.
так как вы используете много статических библиотек, вы можете создать гигантскую библиотеку, содержащую все библиотеки thos, чтобы вы оказались в одном libray. удалите все библиотеки из своего списка lib и добавьте гигантский. Это уменьшает открытие файла до 1 для библиотек и может ускорить чтение действий.
Ответ 5
Как скомпилировать отладочные сборки как разделяемые библиотеки? Это решит разбухание символа отладки, так как библиотеки импорта крошечные с информацией об отладочной информации или без нее. Возможно, это не лучшее решение, но я думаю, что это существенно сократит время связи...