У меня есть небольшой фрагмент кода, который зависит от многих статических библиотек (a_1-a_n). Я хотел бы упаковать этот код в статическую библиотеку и сделать его доступным другим людям.
Моя статическая библиотека, назовем ее X, компилируется нормально.
Я создал простой пример программы, которая использует функцию из X, но когда я пытаюсь связать ее с X, я получаю много ошибок о пропущенных символах из библиотек a_1 - a_n.
Есть ли способ, которым я могу создать новую статическую библиотеку, Y, которая содержит X и все функциональные возможности, необходимые для X (выбранные биты от a_1 - a_n), чтобы я мог распространять только Y, чтобы люди могли связать их программы?
ОБНОВИТЬ:
Я смотрел на простой дамп всего с помощью ar и создание одной мегабиблиотеки, однако, в результате получается много ненужных символов (все файлы .o имеют размер около 700 МБ, однако статически связанный исполняемый файл равен 7). MB). Есть ли хороший способ включить только то, что действительно нужно?
Это тесно связано с тем, как объединить несколько библиотек C / C ++ в одну? ,
-r
, позволяющую использовать вывод в качестве ввода для ld. Если вы сделаете ссылку после того, как получите перемещаемую библиотеку, вы можете заменить ваши библиотеки. (пробовал хотя).Если вы используете Visual Studio, то да, вы можете сделать это.
Инструмент для создания библиотек, поставляемый с Visual Studio, позволяет объединять библиотеки в командной строке. Однако я не знаю, как сделать это в визуальном редакторе.
источник
В Linux или MingW с набором инструментов GNU:
Из, если вы не удалите
liba.a
иlibb.a
, вы можете сделать «тонкий архив»:В Windows с набором инструментов MSVC:
источник
ar crsT
, который делает что-то вроде "символической ссылки" вместо копирования, тогда вам нужно только отправить одну копию данных.Статическая библиотека - это просто архив
.o
объектных файлов. Извлеките их с помощьюar
(в предположении Unix) и упакуйте обратно в одну большую библиотеку.источник
В качестве альтернативы
Link Library Dependencies
свойствам проекта существует другой способ связывания библиотек в Visual Studio.Add Existing Item...
).Item Type
этоLibrary
Это будет включать в себя другие библиотеки в X, как будто вы запустили
источник
Обратите внимание, прежде чем читать остальное: сценарий оболочки, показанный здесь, безусловно, небезопасен для использования и хорошо протестирован. Используйте на свой риск!
Я написал скрипт bash для выполнения этой задачи. Предположим, ваша библиотека - lib1, а из которой вам нужно включить некоторые символы - lib2. Теперь скрипт выполняется в цикле, где сначала проверяется, какие неопределенные символы из lib1 можно найти в lib2. Затем он извлекает соответствующие объектные файлы из lib2
ar
, немного переименовывает их и помещает в lib1. Теперь может быть больше пропущенных символов, потому что материал, который вы включили из lib2, нуждается в другом материале из lib2, который мы еще не включили, поэтому цикл необходимо запустить снова. Если после нескольких проходов цикла изменений больше нет, т.е. объектные файлы из lib2 не добавлены в lib1, цикл может остановиться.Обратите внимание, что включенные символы по-прежнему указываются как неопределенные
nm
, поэтому я отслеживаю объектные файлы, которые были добавлены в lib1 сами по себе, чтобы определить, можно ли остановить цикл.Я назвал этот сценарий
libcomp
, чтобы вы могли вызвать его, например, с помощьюгде lib, откуда вы хотите включить символы. Тем не менее, я думаю, что безопаснее всего сначала скопировать все в отдельный каталог. Я бы не стал доверять своему сценарию (однако, он сработал для меня; я мог бы включить libgsl.a в мою библиотеку чисел и пропустить этот переключатель компилятора -lgsl).
источник