Как я могу узнать, какие библиотеки динамически связаны в статическую библиотеку? - PullRequest
2 голосов
/ 27 мая 2011

Допустим, у меня есть статическая библиотека libmy.a, и я хочу знать, какие библиотеки она динамически связывает. На самом деле мне это нужно для следующего: я собираюсь создать новую динамическую библиотеку, скажем, libmy2.so, которая свяжет, скажем, файл .o (объектный файл) и libmy.a. Поэтому мне интересно, какие библиотеки в конечном итоге загрузят libmy2.so.

Ответы [ 4 ]

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

Статические библиотеки не связывают другие библиотеки, статические или динамические.

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

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

Динамическая библиотека будет динамически связываться только с теми динамическими библиотеками, которые вы указали с помощью -l при ее создании. Статические библиотеки в основном связывают временные объекты, представляющие набор файлов * .o, и они должны обрабатываться компоновщиком для создания исполняемого кода, поэтому не требуется, чтобы при построении статической библиотеки были предоставлены все реализации. Все устанавливается во время последней ссылки целевого исполняемого файла.

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

на Mac, это будет нм -m C libname.a

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

Вы можете использовать следующие команды для проверки содержимого ваших статических библиотек:

nm -C libname.a | less  

или

$ar -vt libname.a 
...