проблема со связыванием в Linux (не удается найти название соответствующей библиотеки)

#c #c #linux #linker #xmpp

#c #c #linux #компоновщик #xmpp

Вопрос:

Я пытаюсь использовать библиотеку (http://code.google.com/p/qxmpp /) но я не могу найти название библиотеки, с которой ее можно связать. Я хочу понять, как вы можете узнать название библиотеки для использования в параметрах привязки.

Комментарии:

1. Разве документация библиотеки не сообщает вам?

2. в документации ничего не говорится о компиляции

Ответ №1:

Похоже, что это только исходный архив — двоичные файлы не включены. Вы создали библиотеку на его основе? Куда процесс сборки поместил это? /usr/lib или /usr/local/lib были бы обычными подозреваемыми, но прочитайте документацию по сборке и установке в пакете.

Комментарии:

1. Я установил его через apt-get в Ubuntu и нашел файл библиотеки .a «/usr/lib/ libqxmpp.a», но связывание с libqxmpp не работает

2. Опубликуйте командную строку compile и link, которую вы используете. Вы вводите -lqxmpp в командную строку?

3. -lqxmpp сработал, большое вам спасибо. является ли правилом называть библиотеку с префиксом l?

4. -l Параметр командной строки указывает компоновщику добавить указанную библиотеку при попытке компоновки. В unix компоновщик автоматически добавит lib к заданному имени при поиске файла библиотеки. Итак, если вы скажете, -lfoo компоновщик будет искать libfoo.a или libfoo.so . Он ищет файл в стандартном пути поиска библиотеки, который вы можете расширить, используя -L опцию добавления дополнительных каталогов к пути (представьте, что -L для компоновщика и библиотек то же, что -I для компилятора и заголовочных файлов.)

Ответ №2:

Учитывая, что имя библиотеки libqxmpp.a и (как вы упомянули в комментарии), что она находится в обычном каталоге lib ( /usr/lib ), вы можете легко вывести правильные параметры:

gcc и у других компиляторов есть -l переключатель, который находит библиотеку на основе имени, которое вы ей даете. По умолчанию он будет искать пути, указанные GCC во время сборки (обычно /lib и /usr/lib ) и любые другие, указанные /etc/ld.so.conf . Если вы добавите переключатель -lX , он будет добавляться lib к имени и по умолчанию добавлять .so и искать любой файл, который выглядит как libX.so , в любом из известных ему каталогов lib.

Работая в обратном направлении, мы можем сделать вывод, что вызов gcc с -lqxmpp будет искать файл с именем libqxmpp.so (на самом деле, он также ищет несколько других имен). Как мы можем заставить его искать .a файл? Эти ar chives ( man ar ) являются статическими библиотеками, поэтому передайте -static переключатель непосредственно перед библиотекой:

 gcc -o progname your.o program.o files.o -static -lqxmpp
  

(Если вам нужно связать с другими библиотеками, вам может потребоваться добавить -Wl,-dynamic для них, если вы не хотите, чтобы они были статически связаны, или если статические библиотеки недоступны.)

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

 gcc -o progname your.o program.o files.o /usr/lib/libqxmpp.a
  

… И это работает точно так же.