Можно ли с помощью компоновщика gcc создать статическую библиотеку? - PullRequest
4 голосов
/ 25 декабря 2010

У меня есть библиотека, состоящая из 300 файлов C ++.

Программа, которая использует библиотеку, не хочет динамически ссылаться на нее. (По разным причинам, но лучше всего то, что некоторые из поддерживаемых платформ не поддерживают динамическое связывание)

Затем я использую g ++ и ar для создания статической библиотеки (.a), этот файл содержит все символы всех этих файлов, включая символы, которые библиотека не хочет экспортировать.

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

При создании динамической библиотеки (.dylib / .so) вы можете использовать компоновщик, который может разрешать все символы внутри библиотеки и экспортировать только те, которые библиотека хочет экспортировать. Однако результат может быть «привязан» только к потребляющей программе во время выполнения.

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

Если мои поиски в Google верны, думая, что это действительно невозможно, я бы хотел понять, почему это невозможно, так как кажется, что многие программы на c и c ++ могли бы извлечь выгоду.

Ответы [ 2 ]

4 голосов
/ 25 декабря 2010

Статические библиотеки - это просто архивы (отсюда и ".a"), коллекция файлов .o.Как архив tar, просто еще проще.Поскольку ar не является компоновщиком, здесь нет конгломерации (как это сделал бы «ld -r») и, следовательно, нет исключения внутрибиблиотечных символов.

Именно поэтому разделяемые библиотеки были изобретены в первую очередь, и они довольно частотеперь люди просто игнорируют недостатки статических библиотек.Они просто говорят: «Он компилируется? Отправьте его».

1 голос
/ 25 декабря 2010

Я не пробовал и не проверял это, но похоже, что способность ld выполнять инкрементное или частичное связывание может быть тем, что вы ищете. Проверьте, будет ли параметр --relocatable (вам также может понадобиться посмотреть параметр -Ur при работе с C ++) применительно к объектным файлам, которые попадут в библиотеку, делать то, что вы хотите.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...