Подтвердить что ты не робот

Советы по сокращению времени связывания С++

У меня есть проект, который занимает около 8 секунд для связи с g++ и ld.

Он использует кучу статических библиотек, большая часть кода - С++.

Мне интересен общий список советов о том, как сократить время ссылки. Все, что угодно: "не включать символы отладки", чтобы "сделать ваш код менее спагетти"

4b9b3361

Ответ 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

Как скомпилировать отладочные сборки как разделяемые библиотеки? Это решит разбухание символа отладки, так как библиотеки импорта крошечные с информацией об отладочной информации или без нее. Возможно, это не лучшее решение, но я думаю, что это существенно сократит время связи...