2008-11-07 2 views
7

Я довольно новичок в потоке сборки C++, и я думаю о переключении на использование частичного связывания для моих библиотек вместо создания архивов ar. Я надеюсь сократить время ссылки на неизбежном заключительном этапе компиляции, который у меня есть, и я считаю, что частичное связывание некоторых библиотек однажды может сэкономить время, связав все на этом последнем этапе.g ++ частичное связывание вместо архивов?

Это то, что я описываю, возможно? Я полагаю, что это должно быть что-то вроде линий ld -Ur -o mylib.o [components]. Существуют ли важные соображения, которые я не учитываю?

ответ

6

Вы теряете важный эффект наличия объектных файлов в архиве ar, которая является то, что только ссылочные объекты будут связаны.

Если у вас есть и foo.o с символом foo и bar.o с символ bar в архиве ar, и ссылаться только на символ foo, будет связан только foo.o. Если вы вместо этого сделаете частичную ссылку, содержимое обоих закончится в исполняемом файле, даже если bar никогда не упоминается нигде.

Вы также можете попробовать более быстрый компоновщик, например gold.

+0

Так что в принципе исполняемый навороты можно ожидать как недостаток более быстрой связи, так? – cdleary 2008-11-07 01:45:08

0

В другой раз, когда вы хотите использовать ld -r для частичной ссылки, вы имеете некоторые объектные файлы, содержащие статическую инициализацию, которые необходимы для обеспечения определенной функциональности, но которые никогда не вызываются напрямую каким-либо кодом.

Если вы хотите написать документ, демонстрирующий, как это работает и почему он работает!

(см., Например, время выполнения регистрации класса C++, он использует функцию статического регистра, которая регистрируется в реестре, которая затем может использоваться для создания и возврата базы * с полиморфным поведением, поскольку она создала новый объект, который был Унаследовано от Base. См. C++ runtime knowledge of classes, который является ответом на вопрос, который я задал.)