Как узнать, в какой библиотеке находится данный объект?

StackOverflow https://stackoverflow.com/questions/290799

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

Мне просто нужно знать, какие библиотеки необходимы, или есть какой-то инструмент или команда, которые могут помочь мне в этом разобраться?

Это было полезно?

Решение

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

nm -D /lib/libc.so.6

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

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

Другие советы

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

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

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

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

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

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

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

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

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top