неопределенная ссылка при использовании общей библиотеки

Я хочу использовать одну программу в качестве общей библиотеки для другой программы.

Я начал следующим образом: у меня есть приложение, которое я скомпилировал, используя:

/usr/bin/g++ -I/usr/include/libxml2  -Xlinker -zmuldefs -fPIC -c a.cpp
/usr/bin/g++ -I/usr/include/libxml2  -Xlinker -zmuldefs -fPIC -c b.cpp
/usr/bin/g++ -I/usr/include/libxml2  -Xlinker -zmuldefs -fPIC -c c.cpp

Затем я создал общую библиотеку объектов из объектов, которые я получаю из этого файла с помощью этой команды:

g++ -fPIC -Xlinker -zmuldefs -shared -o libabc.so a.o b.o c.o

После этого я получаю файл libabc.so, который копирую в

sudo cp libabc.so /usr/local/lib/libabc.so

Теперь, когда я компилирую свое оригинальное приложение, которое будет использовать эту недавно созданную библиотеку libabc.so, используя эту команду:

/usr/local/lib/libabd.so: undefined reference to `xmlXPathNewContext'

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


person Hasan Ali Khattak    schedule 12.06.2012    source источник


Ответы (2)


Возможно, вам придется передать путь также с помощью -I/path/to/library или, альтернативно, экспортировать его в LD_LIBRARY_PATH.

person Omar Khan    schedule 12.06.2012
comment
я пробовал это, но он все еще говорит, что /usr/include/lib/libabc.so :undefined reference to "xmlXPathNewContext" - person Hasan Ali Khattak; 12.06.2012

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

person Marco Leogrande    schedule 12.06.2012
comment
Мы не можем помочь больше, не имея более подробной информации: libxml2 установлен в масштабе всей системы (т. е. есть ли файл /usr/lib/libxml2*so)? Какая командная строка используется для сборки вашего приложения? Если вы попытаетесь использовать некоторые libxml2 функции непосредственно из своего приложения, сможет ли компоновщик решить эти ссылки? - person Marco Leogrande; 13.06.2012
comment
libxml2 — это библиотека, которая $ ls -h /usr/lib/libxml2.* возвращает /usr/lib/libxml2.a /usr/lib/libxml2.so /usr/lib/libxml2.so.2.7.8 /usr/lib/libxml2.la /usr/lib/libxml2.so.2. Я использовал эти команды для создания своего приложения /usr/bin/g++ -I/usr/include/libxml2 -Xlinker -zmuldefs -fPIC -c neoclassic.cc - person Hasan Ali Khattak; 13.06.2012
comment
когда я использовал -llibxml2, выдает ошибку /usr/bin/ld: cannot find -llibxml2 - person Hasan Ali Khattak; 13.06.2012
comment
когда я запускаю свое основное приложение g++ -lneoclassic -lrt -o common/ptypes2tcl common/ptypes2tcl.o /usr/local/lib/libneoclassic.so: undefined reference to 'xmlXPathNewContext', я подумал просмотреть свой libneoclassic.so nm -D /usr/local/lib/lneoclassic.so | grep xmlXPathNewContext, и он вернул мне U xmlXPathNewContext - person Hasan Ali Khattak; 13.06.2012
comment
Когда вы связываете свое приложение, вам нужно добавить -lxml2 в командную строку; осторожно это -lxml2, а не -llibxml2. Итак, используйте g++ -lneoclassic -lrt -lxml2 -o common/ptypes2tcl common/ptypes2tcl.o - person Marco Leogrande; 13.06.2012
comment
я пытался, но не работал, поэтому я попробовал g++ -o common/ptypes2tcl common/ptypes2tcl.o -lneoclassic -lrt -lxml2, и это сработало как шарм. Я думаю, мне нужно узнать о Makefiles. но спасибо @marco-leogrande - person Hasan Ali Khattak; 14.06.2012