«Неразрешенный текстовый символ» - как мне найти нужную библиотеку - PullRequest
3 голосов
/ 08 июля 2009

Прошу прощения за вопрос новичка, мой C очень, очень ржавый. Пытаясь собрать xrunclient из http://www.leftfield.org/~dd/sw.html, на IRIX64, я сталкиваюсь с:

ld32: ОШИБКА: 33: Неразрешенный текстовый символ "XOpenDisplay"

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

Ответы [ 2 ]

3 голосов
/ 09 июля 2009

Научите человека ловить рыбу:

nm -o /usr/lib/lib*.a 2>/dev/null | 
grep  XOpenDisplay | 
grep -w T

Что это делает

  1. Запросить символы во всех библиотеках в /usr/lib. (В 64-битной системе вам может потребоваться проверить /usr/lib64.) Опция -o печатает не только символ, но и имя файла, из которого он получен.

  2. Возьмите интересующий вас символ: XOpenDisplay.

  3. Grep для определений этого символа в разделе text - одиночный T - это то, как nm(1) сигнализирует определение в текстовом разделе. Возможно, я также пытался grep -w [TD] получить текст или данные.

Ответ немного удивителен:

/usr/lib/libSDL.a:SDL_x11dyn.o:00000380 T XOpenDisplay
/usr/lib/libX11.a:OpenDis.o:00000420 T XOpenDisplay

Я не уверен, что такое -lSDL (если бы я позаботился, я бы за это погуглил), но есть -lX11 размером с жизнь.

Теперь вы можете найти любой недостающий символ, который вы хотите: -)

1 голос
/ 09 июля 2009

Ответ - libX11.so - он содержит основные подпрограммы Xlib, и вы можете сказать, что это подпрограмма Xlib, потому что она начинается с простого "X". Если бы он начинался с «Xt», то вы бы знали, что это метод из набора виджетов Xt.

Я не верю, что название этой библиотеки изменилось за 15 с лишним лет, поэтому команда компиляции, показанная в книге, должна работать для вас. Я считаю, что имя библиотеки также указано на странице руководства для подпрограмм X (что, конечно, означает, что у вас должны быть доступны справочные страницы, а не все).

Кроме этого, grep может быть вашим лучшим выбором, хотя поиск в / usr / lib приведет к появлению как ссылок на функцию, так и на объявление, так что это, вероятно, бесполезно. Также есть утилита командной строки (вы работаете в Linux, верно?), Которая покажет содержимое .so, что также может быть полезно.

Редактировать: ах, Ирикс, а не Linux; не заметил этого при первом прочтении. Я думаю, что лучшим подходом будет поиск справочных страниц.

...