частичное связывание g ++ вместо архивов? - PullRequest
7 голосов
/ 07 ноября 2008

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

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

Ответы [ 2 ]

6 голосов
/ 07 ноября 2008

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

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

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

0 голосов
/ 16 октября 2010

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

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

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

...