Как я могу узнать, в какой библиотеке находится данный объект? - PullRequest
4 голосов
/ 14 ноября 2008

Я программирую на FORTRAN и C на SGI под управлением Irix 6.5, но это должно быть применимо ко всем Unix-подобным системам. Как мне найти библиотеку, с которой мне нужно связать свою программу, когда я получаю ошибку ссылки "неразрешенный текстовый символ"? Вот пример того, что я вижу от компоновщика:

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

Нужно ли мне просто знать, какие библиотеки требуются, или есть какой-нибудь инструмент или команда, которая может помочь мне понять это?

Ответы [ 5 ]

9 голосов
/ 14 ноября 2008

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

nm -D /lib/libc.so.6

и затем grep для символа, который вы ищете. Опустите -D для статических библиотек. Вы можете использовать это в цикле или с xargs для сканирования нескольких библиотек.

Я обычно просто использую Google (при условии, что символ взят из общедоступной библиотеки).

3 голосов
/ 15 ноября 2008

Я сопротивлялся искушению добавить это к ответу Роберта Гэмбла - считай это дополнением к нему.

Остерегайтесь простого предположения, что «любое совпадение» подходит для использования. В другом вопросе SO был случай, когда часть кода была перемещена из Windows в Unix, и код Windows использовал getch() для чтения одного символа из ввода. Пользователь прошел процесс, аналогичный этому, и обнаружил getch() в Unix в библиотеке curses. Итак, пользователь связался с библиотекой curses и задумался, почему выгружено ядро ​​кода. Проблема в том, что фактически используемый getch() предполагает, что правильная инициализация была выполнена, а правильная инициализация не была выполнена. На самом деле, вероятно, это была не та рутина, которая была необходима.

В Solaris есть опции для nm, которые сообщают вам имя библиотеки и даже объектный файл в библиотеке, содержащей символ (это -r для имени библиотеки и -R для объекта в библиотеке).

Остерегайтесь искаженных имен в C ++. Пример ortho2 явно не искажен в C ++.

3 голосов
/ 14 ноября 2008

Использование nm (как в ответ Роберта Гэмбла ) является правильным ответом на ваш вопрос. Хитрость в том, чтобы знать, где искать библиотеки. Что делает ваша программа? Если происходит большое количество чисел, есть вероятность, что вы должны ссылаться на математические библиотеки (например, LAPACK или BLAS) и, возможно, захотите начать поиск там. Поиск в Интернете также может быть полезен - я набрал "ortho2" в моей любимой поисковой системе и получил эту документацию , которая предполагает, что она находится в libfgl.a

Обратите внимание, что при поиске вам, вероятно, следует пропустить завершающее подчеркивание - оно обычно добавляется компилятором в имя подпрограммы.

2 голосов
/ 17 ноября 2008

У меня есть небольшой скрипт для поиска. Введите lookfor func_name

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
2 голосов
/ 15 ноября 2008

Если это стандартная функция, которой может быть ortho2, на странице руководства будет указано, в какой библиотеке она находится.

...