Статическая библиотека и динамическая библиотека - больше удовольствия от C ++ - PullRequest
1 голос
/ 07 декабря 2011

Допустим, я хочу создать динамическую библиотеку dynamic.so, но мой код ссылается на функцию, которая существует в какой-то другой статической библиотеке static.a.Естественно, если я скомпилирую и свяжу с g++ и опцией -shared, dynamic.so будет ожидать, что указанная функция будет реализована в какой-то другой динамической библиотеке, которую мне нужно будет связать во время выполнения вместе с dynamic.so.Другими словами, он будет счастлив, пока я делаю -l static (по модулю синтаксиса).

Но поскольку эта другая библиотека на самом деле статическая, я не могу этого сделать.Давайте предположим, что я не могу связать статическую библиотеку во время компиляции моей основной программы, но я вынужден использовать только динамические библиотеки.Поэтому я действительно хочу включить скомпилированный код из ссылочной функции из static.a в dynamic.so.

Этот ответ на связанный вопрос предполагает использование опции --whole-archive длявключают static.a в dynamic.so.Однако в моем случае static.a огромен.И мне действительно не нужно все это, мне нужно только одно определение функции.

Этот ответ на другой вопрос объясняет, что соединение со статической библиотекой во время компиляции означает, что толькокод, на который фактически ссылаются, включается в двоичный файл.Ну, это именно то, что я хотел бы сделать для моей ссылки на одну функцию!Я действительно не хочу, чтобы весь статический архив был там.

Но как мне этого добиться?Как я могу включить только необходимые части static.a в dynamic.so?

1 Ответ

1 голос
/ 07 декабря 2011

Вам не нужно --whole-archive: просто свяжите ваш dynamic.so следующим образом:

gcc -shared -fPIC -o dynamic.so $(OBJS) -lstatic

Это приведет к динамическому. Так что все, что нужно компоновщику от libstatic.a. См. этообъяснение , чтобы понять, почему это так.

Одной из проблем может быть то, что ваш libstatic.a скомпилирован без -fPIC.На 32-битном x86/Linux это все равно будет работать (хотя ваша библиотека не сэкономит вам много оперативной памяти, если ее используют несколько процессов).На x86_64 связывание не-fPIC-кода в общей библиотеке не может работать, поэтому вам придется перестроить его с помощью -fPIC.

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