автономная статическая библиотека (.a) с cmake - PullRequest
1 голос
/ 02 мая 2011

Мне нужно предоставить SDK со статической библиотекой. Давайте назовем это "libsdk.a". Надеемся, что эта библиотека будет автономной, то есть простой пример «example.cpp» может ссылаться на нее без какой-либо другой библиотеки, кроме системных.

Вот моя конфигурация:

  • cmake для всех моих 10 библиотек зависимостей. Есть статическая библиотека (.a), сгенерированная для каждого моего модуля. Эти библиотеки содержат только объектные файлы .o данного модуля. Дерево зависимостей не является плоским, некоторые из них зависят от других.
  • простой пример "example.cpp" с cmake, который компилирует и работает. На этом уровне cmakes генерирует очень сложную команду связи для работы с деревом deps.
  • внешние зависимости, такие как boost (некоторые статические библиотеки тоже)

На данный момент я попробовал это:

  • создает архив различных сгенерированных .a, но это не работает, потому что связывание с этой библиотекой говорит мне, что у архива нет индекса (даже после ranlib). И все же я вспомнил, что могу без проблем добавлять библиотеки .a в файлы .a.
  • извлекает все файлы объектов .o (с ar -x) из всех файлов * .a и воссоздает файл "libsdk.a" со всеми этими объектными файлами. Это также не работает (неразрешенные ссылки). Более того, он включает в себя все объекты, даже те, которые не нужны ... Мой рабочий пример занимает 3.7M. Эта библиотека около 35 млн.
  • создать разделяемую библиотеку .so. Кажется, это работает, но я бы предпочел иметь статическую библиотеку.
  • компилировать все статически, но компоновщик жалуется, что не находит -lgcc_s. Хорошо, я хочу скомпилировать в статическом режиме, но не так далеко, и просто мои собственные библиотеки вместе!

Итак, мой последний вопрос: можно ли как-нибудь сгенерировать мою статическую библиотеку, содержащую все мои другие библиотеки, а не системные?

Кстати, еще одна интересная тема по этому поводу: Объединение статических библиотек

Спасибо за любой совет, чтобы открыть мой разум!

Ответы [ 2 ]

1 голос
/ 02 мая 2011

То, что вы пытаетесь сделать вручную - это работа компоновщика.Хотя это возможно, вам не следует беспокоиться об этом.

Когда вы компилируете libsdk.a, убедитесь, что все его зависимости связаны статически.Если вы сделаете это, libsdk.a должен быть автономным.Статическое связывание означает копирование кода в нужные места в конечном исполняемом файле, поэтому все, что связано статически, не нужно будет предоставлять во внешнем файле.

0 голосов
/ 07 мая 2011

См. это сообщение в списке рассылки CMake .libutils.cmake, прикрепленный к сообщению, имеет макрос MERGE_STATIC_LIBS (), который выполняет эту работу.В Linux (и во всех других Unixes, кроме OSX) он использует ar для упаковки и распаковки объектных файлов.

...