C++:链接库在执行过程中消失并给出segfault
C++: linked library disappears and gives segfault during execution
我在构建库时遇到问题。在Makefile中,我通过放入-ltclstub8.6来告诉g++我需要tclstub.6,g++会考虑到这一点(很抱歉这些法语消息):
make: AVERTISSEMENT : le fichier « ../Linux-PORT/i586-GCC4/Makefile » a une date de modification 609 s dans le futur
*** Compile c [gcc] libtestGuiMnt_info.Linux-PORT.i586-GCC4.c
*** Compile C++ [g++] mntdisplay.cc
*** Compile C++ [g++] mntogl.cc
mntogl.cc: In member function 'virtual int MNTOgl::Display() const':
mntogl.cc:228:12: warning: unused variable 'ErrorCheckValue' [-Wunused-variable]
*** Compile C++ [g++] mntdisplaylist.cc
*** Compile C++ [g++] mntmanager.cc
*** Compile C++ [g++] mntdisplay_wrap.cc
*** Link (g++) librairie partagée /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1 -Wl,-Bdynamic -L/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib -Wl,-rpath,/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib -lapcomutil -lapmntcom -lapmntdata -lapmntnoyau -lapcomenvEtude -lapcomenv -ltclstub8.6 -lGLEW -lGLU -lGL -lglut
make: AVERTISSEMENT : décalage d'horloge détecté. La construction peut être incomplète.
但是当我调用tcl函数时,会发生segfault。
事实上,如果我检查一下刚刚用ldd-r命令构建的库,就会发现除了tclstub8.6之外,所有的外部库都包含在内。
下面是ldd-r命令的输出消息。请注意,libtclstub8.6不会出现。。
列表以libtclstub8.6的所有未定义符号结束。
ldd -r /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1
linux-gate.so.1 (0xb777e000)
libapcomutil.2 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapcomutil.2 (0xb7743000)
libapmntcom.1 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapmntcom.1 (0xb773f000)
libapmntdata.3 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapmntdata.3 (0xb770f000)
libapmntnoyau.4 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapmntnoyau.4 (0xb76e9000)
libapcomenvEtude.1 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapcomenvEtude.1 (0xb76cc000)
libapcomenv.1 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapcomenv.1 (0xb76b8000)
libGLEW.so.1.9 => /usr/lib/libGLEW.so.1.9 (0xb762e000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0xb75a6000)
libGL.so.1 => /usr/lib/libGL.so.1 (0xb7546000)
libglut.so.3 => /usr/lib/libglut.so.3 (0xb750a000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb741e000)
libm.so.6 => /lib/libm.so.6 (0xb73dc000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb73be000)
libc.so.6 => /lib/libc.so.6 (0xb7244000)
libapcomfichier.3 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapcomfichier.3 (0xb7235000)
libapcomitineraire.3 => /apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libapcomitineraire.3 (0xb7190000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0xb7036000)
libz.so.1 => /lib/libz.so.1 (0xb701f000)
libgfortran.so.3 => /usr/lib/libgfortran.so.3 (0xb6f22000)
libglapi.so.0 => /usr/lib/libglapi.so.0 (0xb6f0c000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb6ef9000)
libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb6ef5000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb6eef000)
libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0xb6eeb000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb6db1000)
libxcb-glx.so.0 => /usr/lib/libxcb-glx.so.0 (0xb6d98000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb6d75000)
libXxf86vm.so.1 => /usr/lib/libXxf86vm.so.1 (0xb6d6f000)
libdrm.so.2 => /usr/lib/libdrm.so.2 (0xb6d61000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb6d45000)
libdl.so.2 => /lib/libdl.so.2 (0xb6d40000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb6d30000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb6d25000)
/lib/ld-linux.so.2 (0xb777f000)
liblzma.so.5 => /usr/lib/liblzma.so.5 (0xb6cfb000)
libquadmath.so.0 => /usr/lib/libquadmath.so.0 (0xb6c82000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb6c7e000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6c73000)
undefined symbol: Tcl_DeleteCommandFromToken (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_NewStringObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetCommandInfo (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_SetObjResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetLongFromObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_InitHashTable (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_CreateObjCommand (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_NewBooleanObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_SetResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetStringResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_SetVar (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_VarEval (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetVar (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_AppendResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_AppendElement (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_ObjSetVar2 (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_ResetResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_SetErrorCode (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_PkgProvide (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: _ZN10MNTManager10DisplayAllEv (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetStringFromObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_NewDoubleObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetBooleanFromObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetObjResult (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: TclFreeObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_GetDoubleFromObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_DuplicateObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_DeleteHashEntry (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
undefined symbol: Tcl_NewIntObj (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
有人能帮我解决这个问题吗?非常感谢!
我找到了。
事实上,一切都是因为这条线:
undefined symbol: _ZN10MNTManager10DisplayAllEv (/apollo/Developpement/Build-GCC4/Obj/Linux-PORT/i586-GCC4/lib/libtestGuiMnt.1)
存在MY库的未定义符号。我定义了它并解决了问题!
请参阅我的原始帖子:使用SWIG转换代码实现tcl 的segfault
令人困惑的是,我的程序在tcl包装器函数的中间崩溃了(其中根本没有涉及我的未定义符号)。我真的不知道为什么,但就是这样。
希望它能帮助其他人!
相关文章:
- C++中带有List类的迭代器Segfault
- 将地址分配给本地指针后,公共对象的变量将消失
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 应用投影矩阵后对象消失
- std::partition segfault issue
- OpenSSL: EC_POINT_set_compressed_coordinates_GFp segfault
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- 应用地址清理器后,免费无效指针消失
- 返回的指针属性中类实例上的矢量属性消失
- 检查nullptr是否100%保护内存布局不受segfault影响
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 自动消失的自定义消息框
- 该程序没有产生输出,而是卡在一个循环中,几秒钟后消失并打印被杀死?
- C++ 在地图上循环 - 消失的对象
- 我收到一个断言错误,但是当我编写 cout 语句时,它会消失
- 为什么优化大型 std::vector 数组会导致 SegFault?
- 在函数结束后仅释放 Segfault 与 vsnprintf 一起消失
- C++:链接库在执行过程中消失并给出segfault