частичное связывание g ++ вместо архивов?
Вопрос
Я довольно новичок в процессе сборки C ++, и я думаю о том, чтобы перейти к использованию частичной компоновки для моих библиотек вместо создания архивов ar
. Я надеюсь сократить время компоновки на неизбежном последнем шаге компиляции, который у меня есть, и я полагаю, что частичное связывание некоторых библиотек однажды может сэкономить мне время по сравнению со всем, что связано на этом последнем шаге.
Возможно ли то, что я описываю? Я полагаю, что это должно быть что-то вроде ld -Ur -o mylib.o [компоненты]
. Существуют ли важные аспекты сборки, которые я не принимаю во внимание?
Решение
Вы теряете важный эффект наличия объектных файлов в архиве ar
, а именно то, что только ссылочные объекты будут связаны в.
Если у вас есть foo.o
с символом foo
и bar.o с символом bar
в ar
и ссылаются только на символ foo
, будет связан только foo.o
. Если вместо этого вы сделаете частичную ссылку, содержимое обоих окажется в итоге в исполняемом файле, даже если bar
нигде не упоминается.
Вы также можете попробовать более быстрый компоновщик, например gold .
Другие советы
В другой раз вы хотите использовать ld -r для создания частичной ссылки, если у вас есть несколько объектных файлов, которые содержат статическую инициализацию, которые необходимы для обеспечения определенной функциональности, но никогда не вызываются напрямую каким-либо кодом. р>
Если вы хотите, я могу написать документ, который демонстрирует, как это работает и почему это работает!
(см., например, регистрацию класса C ++ во время выполнения, она использует функцию статического регистра, которая регистрирует себя в реестре, которую затем можно использовать для создания и возврата Base * с полиморфным поведением, поскольку она создала новый объект, который был унаследован из базы. См. знание классов среды выполнения C ++ , которое является ответом на вопрос, который я задал.)