Вопрос системы сборки GNU - PullRequest
6 голосов
/ 30 июня 2010

Как найти библиотеку, которая содержит определение конкретной функции? Я получаю ошибку компоновщика.

Ответы [ 3 ]

4 голосов
/ 30 июня 2010

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

~/src> cat nm-test.c

static int plus_four(int x)
{
        return x + 4;
}

int sum_plus_four(int a, int b)
{
        return plus_four(a + b);
}

int product_plus_four(int a, int b)
{
        return plus_four(a * b);
}
~/src> gcc -c nm-test.c
~/src> nm ./nm-test.o
00000000 t plus_four
00000023 T product_plus_four
0000000b T sum_plus_four

В соответствии с инструкция , 't' означает, что символ находится всегмент кода (текста) и прописные буквы означают, что он общедоступен.

Если у вас есть искомый символ, вы можете использовать nm, чтобы сделать символы, экспортируемые библиотекой, доступными, например, для grep:

$ find -name lib*.a /example/library/path | xargs nm | grep -E "T $SYMBOL_TO_FIND"

Эта командная строка является непроверенным эскизом, но она должна показать концепцию.

1 голос
/ 30 июня 2010

Если вы хотите найти библиотеку не программным способом, вам может пригодиться LSB Navigator . Введите функцию в поле поиска и проверьте библиотеку в строке с зеленым «статусом».

http://coldattic.info/pic/165509391387.png

Это будет «обычная» библиотека, которая содержит функцию (в приведенном выше примере librt - это правильная библиотека для mq_unlink, поэтому вы связываетесь с -lrt). Просто свяжись с этой библиотекой, и она будет работать практически на всех системах Linux.

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

1 голос
/ 30 июня 2010

Если это часть стандартного API C, тогда просто запустите man, в нем должно быть четко указано, где определена функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...