Неопределенный символ в статической библиотеке связан с динамической библиотекой

0

вот моя проблема:

Во время выполнения моя программа, которая загружает общую библиотеку, не загружает ее, она говорит:

libCommunicationModule.so: undefined symbol __builtin_delete

контекст:

  • компилятор: gcc 3.4
  • Linux Debian 4.0 (старый материал....)

У меня статическая библиотека: libtgi_cppd.a, у меня нет источника этой библиотеки. Этот lib связан с общей библиотекой libCommunicationModule.so с этими параметрами -Wl,-whole-archive -ltgi_cppd

Я включил -y в __builtin_delete чтобы проверить:

libtgi_cppd.a(ClientAPI_cpp.o): reference to __builtin_delete
libtgi_cppd.a(ClientInterface.o): reference to __builtin_delete
libtgi_cppd.a(ClientAPI_cpp.o): reference to __builtin_delete

Я пытаюсь добавить ссылку -lstdc++ -lgcc до и после -whole-archive, никаких изменений.

$ nm libCommunicationModule.so | grep __builtin

результат всегда такой:

     U __builtin_delete
     U __builtin_new
     U __builtin_vec_new

Что я могу сделать для решения этой проблемы?

спасибо

Полная команда как требовательная:

g++ -Wl,-y -Wl,__builtin_delete -Wl,--trace -Wl,-rpath,/usr/local/qt/lib -shared 
-Wl,-soname,libCommunicationModule-x11-Debug.so.6 -Wl,-rpath,/home/sncf/AGC_IHM/AGC/Tms/Gui/Components/CommunicationModule/x11/Debug 
-o libCommunicationModule-x11-Debug.so.6.0.1 x11/Debug/Obj/CommunicationModule-Build.o x11/Debug/Obj/CommunicationModuleFilesAutoGen.o x11/Debug/Obj/CommunicationModuleParamsAutoGen.o 
x11/Debug/Obj/CommunicationModule.o 
x11/Debug/Obj/CommunicationModuleAutoGen.o 
x11/Debug/Obj/CommDebugDlg.o 
x11/Debug/Obj/moc_CommunicationModule.o x11/Debug/Obj/moc_CommDebugDlg.o  
-L/usr/local/qt/lib 
-L/usr/X11R6/lib -lBuildInformations-x11-Debug 
-lBagsLib-x11-Debug -lConfigParamsLib-x11-Debug 
-lIniLib-x11-Debug -lModuleHandling-x11-Debug 
-lGenericRuntimeInfoLib-x11-Debug 
-lDebugLib-x11-Debug -lTCNLib-x11-Debug 
-lGUITools-x11-Debug -lQtEventsLib-x11-Debug 
-lPackUnpack-x11-Debug -L/home/sncf/AGC_IHM/AGC/Tms/Gui/ProjectLib/x11 
-L/home/sncf/AGC_IHM/AGC/Tms/Gui/Components/AGCTCNClientAPI/2004.09.21/posix_linux_i586/lib
-lqt-mt -lXext -lX11 -lm -lpthread -Wl,-whole-archive -ltgi_cppd -lstdc++ -lgcc 
  • 0
    Я просто проверяю с помощью ldd, все в порядке, он обращается как к системным библиотекам, так и к конкретным библиотекам приложений, и разрешения в порядке.
  • 0
    @dgrat, глядя на результат nm, я увидел, что статическая библиотека была gcc2_compiled (так что, конечно, 2.95). Я проверяю, что можно сделать для совместимости.
Показать ещё 4 комментария
Теги:
static-libraries
shared-libraries
undefined-symbol

2 ответа

0
Лучший ответ

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

  • 1
    Вы просто спасли мой день, заставив меня понять, что моя проблема (похожая на OP) была вызвана попыткой вызвать функцию C ++ из C без указания extern C в коде C ++. Ура!
0
  1. Выполните команду ldd, и в ней будут перечислены все разделяемые библиотеки, используемые вашей программой.

  2. Проверьте переменную среды LIBPATH/LD_PATH в среде выполнения. И убедитесь, что все эти библиотеки присутствуют на этом пути

  3. Убедитесь, что все файлы библиотеки имеют достаточное разрешение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню