Связывание динамической библиотеки со статической библиотекой (предварительное связывание динамической библиотеки) - PullRequest
1 голос
/ 07 июля 2011

У меня есть очень маленькая библиотека, которую я хотел бы превратить в статическую (libx.a), но эта библиотека зависит от динамической библиотеки (liby.so). Я хотел бы иметь возможность "предварительно связать" мою статическую библиотеку, чтобы в libx.a уже была ссылка на liby.so.

Это позволило бы мне не указывать опцию -ly при компиляции программы, в которой присутствует -lx. Это упрощает компоновку с libx, особенно если это зависит от многих разделяемых библиотек.

Возможно ли это? Если да, то как (предполагая gcc)?

Тем не менее, если возможно, если программа, использующая libx, использует саму liby, будет ли происходить какое-то забавное дублирование (я полагаю, переменных)?

Ответы [ 3 ]

1 голос
/ 08 июля 2011

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

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

В последнем случае большинство людей решают эту проблему с помощью pkg-config. Другой подход, который был бы довольно специфичным для GNU, заключался бы в установке сценария компоновщика GNU вместо необработанного файла .a и предоставлении сценарием компоновщика ссылки как на статическую библиотеку, так и на требуемую общую библиотеку.

0 голосов
/ 21 января 2014

Проблема может быть решена с помощью интеллектуальной системы сборки. Я могу рекомендовать использовать gyp . У него есть опция link_settings для статических библиотек:

{
  'targets': [
    {
      'target_name': 'x',  # will generate libx.a
      'type': 'static_library',
      'sources': [],
      'link_settings': {
        'libraries': ['-ly'],
      },
    },
    {
      'target_name': 'test',
      'type': 'executable',
      'dependencies': ['x'],
      'sources': [],
    },
  ],
}
0 голосов
/ 07 июля 2011

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

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