Зависимости компоновщика при смешивании статических и общих библиотек

У меня есть следующий вопрос о линковке в Linux:

Предположим, у меня есть класс Foo, который использует Qt. Чтобы создать этот класс, я должен использовать qmake для генерации Makefile.

Позже я хочу использовать этот класс Foo для модуля Perl, который является общей библиотекой. Тем не менее, чтобы создать его, я должен использовать Perl MakeMaker для создания собственного Makefile.

То, как я это делаю сейчас, заключается в том, что я создаю класс Foo как статическую библиотеку, а при создании разделяемой библиотеки модуля Perl я связываю его со статической библиотекой Foo.

Проблема в том, что при создании разделяемой библиотеки модуля Perl мне нужно связать ее со всеми теми библиотеками Qt, с которыми связана статическая библиотека Foo.

Итак, вопрос:

  1. Имеет ли этот подход смысл?

  2. Можно ли построить статическую библиотеку Foo так, чтобы мне не пришлось указывать все ее зависимости при сборке разделяемой библиотеки модуля Perl? (Потому что довольно сложно добавить все эти зависимости в Makefile модуля)

  3. Будет ли что-то другое, если библиотека Foo будет общей, а не статичной?

1

Решение

1) Вы не можете связать статическую библиотеку с общей библиотекой.

2) Вам не нужно явно ссылаться на FooЗависимости, если Foo сам был DSO

3) Вы можете легко изменить Makefile.PL LIBS раздел, чтобы добавить дополнительные зависимости компоновщика.

4) Qt — это прямая боль для статической связи в любом случае. Лучше всего делать весь динамический шебанг, если у вас нет конкретных зависимостей версий и ограничений ОС / платформы. Подсказка: даже если у вас есть «статическая» сборка Qt, эта «статическая» сборка не будет включать в себя вещи, которые могут быть решены в качестве загружаемых модулей. Был там.

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

Но лучше всего сделать Foo динамическая библиотека .. все счастливы тогда.

2

Другие решения

1) Это зависит от вашей цели.

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

3) Если речь идет о минимизации размера исполняемого файла, вам придется пойти на общие библиотеки. Тогда вы должны собрать все как общую библиотеку.

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

Преимущество связывания с общим имеет меньший размер кода, но в то же время на целевой платформе должны быть установлены надлежащие общие библиотеки.

1

По вопросам рекламы [email protected]