Советы по сокращению времени компоновки c ++ - PullRequest
17 голосов
/ 29 декабря 2010

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

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

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

Ответы [ 5 ]

10 голосов
/ 29 декабря 2010

Я занимался этим годами на предыдущей работе.У компоновщика GNU просто возникают серьезные проблемы с производительностью при связывании большого количества статических библиотек.В какой-то момент время компоновки было на одном уровне со временем компиляции, что нам показалось настолько странным, что мы на самом деле исследовали это и выяснили.

Вы можете попробовать объединить ваши статические библиотеки в «суперобъект» перед компоновкой,Вместо того чтобы ссылаться так:

$ g++ -o program program.o $STATIC_LIBS

Вы можете попробовать это:

$ ld -r -o libraries.o --whole-archive $STATIC_LIBS
$ g++ -o program program.o libraries.o

Обратите внимание, что этот метод дает компоновщику меньше возможностей для исключения неиспользуемого объектного кода, поэтому ваши двоичные файлы могут увеличитьсяразмер несколько.

3 голосов
/ 29 декабря 2010

создайте виртуальный диск, скомпилируйте его и свяжите с жестким диском.

, так как вы используете много статических библиотек, вы можете создать гигантскую библиотеку, содержащую все эти библиотеки, так что вы получите один libray.удалите все библиотеки из вашего lib-списка и добавьте гигантский.Это уменьшает количество открытий файла до 1 для библиотек и может ускорить чтение.

2 голосов
/ 29 декабря 2010

Отключить оптимизацию всей программы (хотя бы во время разработки).Используйте p-impl, чтобы уменьшить зависимости.

2 голосов
/ 29 декабря 2010

8 секунд - это довольно быстро , если только вы не уверены, что это не займет много времени. У меня есть проекты, которые занимают 5-8 минут для полной перекомпоновки, так как мы не делаем инкрементные ссылки в наших сборках релизов. Вы пробовали использовать инкрементные ссылки (если вы не используете -shared, вы можете использовать -i или -r)?

0 голосов
/ 29 декабря 2010

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

...