Хобрук: Ваш путь к мастерству в программировании

Статическая библиотека и динамическая библиотека - больше удовольствия от C ++

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

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

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

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

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


Ответы:


1

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

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

В результате в dynamic.so будет извлечено все, что требуется компоновщику из libstatic.a.. См. это объяснение, чтобы понять, почему это.

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

07.12.2011
  • Потрясающий! Обратите внимание, что я упомянул -l себя в вопросе: еще раз меня укусил тот факт, что порядок аргументов в gcc имеет значение ... Спасибо! 07.12.2011
  • Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

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

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..