#c #linker #libraries #loader
#c #компоновщик #библиотеки #загрузчик
Вопрос:
Допустим, у меня есть статическая библиотека libmy.a, и я хочу знать, какие библиотеки она динамически связывает. На самом деле мне это нужно для следующего: я собираюсь создать новую динамическую библиотеку, скажем libmy2.so которая свяжет, скажем, файл .o (объектный файл) и libmy.a. Поэтому мне интересно, какие библиотеки будут загружены libmy2.so в конце концов.
Ответ №1:
Статические библиотеки не связывают другие библиотеки, ни статические, ни динамические.
Хорошо, предположим, что два файла C , a.cpp и b.cpp.
g -c a.cpp -o a.o // compile a.cpp to a.o
rm -f lib1.a // no existing lib1.a (this is not essential)
ar rvs lib1.a a.o // create library lib1.a and add a.o to it
g -c b.cpp -o b.o // compile b.cpp to b.o
ar rvs lib1.a b.o // ad b.o to existing lib1.a
Очевидно, что вы можете выполнять любое копирование между этапами, чтобы создать библиотеку с нужным именем. Вы также можете сделать
ar --help
чтобы получить параметры ar, которые могли бы немного упростить процесс. Честно говоря, это команда, которую я почти никогда не использую, за исключением создания статических библиотек из списка объектов.
Комментарии:
1. В частности, вы имеете в виду, что я не могу создать статическую библиотеку, которая статически связывает другие библиотеки?
2. @Narek Да — приложение или разделяемая библиотека могут связываться с другими статическими или совместно используемыми библиотеками, но статические библиотеки не могут, поскольку они являются просто архивами объектных файлов.
3. Что плохого в том, чтобы связать с объектным файлом кучу объектных файлов, то есть статическую библиотеку, и получить набор объектных файлов 1 статическую библиотеку?
4. @Narek Вы можете заархивировать (не связывать) кучу объектных файлов для СОЗДАНИЯ статической библиотеки.
5. Пожалуйста, напишите команду, которая создаст libb1.a из liba1.a, добавив в нее файл MyObject.o.
Ответ №2:
на Mac это было бы nm -m C libname.a
Ответ №3:
Вы можете использовать следующие команды для проверки содержимого ваших статических библиотек:
nm -C libname.a | less
или
$ar -vt libname.a
Ответ №4:
Динамическая библиотека будет динамически подключаться только к тем динамическим библиотекам, которые вы указываете с помощью -l
при ее создании. Статические библиотеки в основном связывают временные объекты, представляющие набор файлов *.o, и они должны обрабатываться компоновщиком для создания исполняемого кода, поэтому нет требования, чтобы при создании статической библиотеки предоставлялись все реализации. Все настраивается во время окончательной ссылки на целевой исполняемый файл.