Как я могу узнать, какие библиотеки динамически связываются со статической библиотекой?

#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, и они должны обрабатываться компоновщиком для создания исполняемого кода, поэтому нет требования, чтобы при создании статической библиотеки предоставлялись все реализации. Все настраивается во время окончательной ссылки на целевой исполняемый файл.