c++ - 由于第三方库的名称冲突导致的段错误

标签 c++ linker segmentation-fault hydra

我正在尝试使用 sixense 的专有 sdk(游戏 Controller 驱动程序)。看起来它们静态链接到 boost::thread。我的应用程序及其某些依赖项也使用了 boost::thread,但出现了段错误。

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bd1bb5 in boost::thread::start_thread() () from /usr/lib/libboost_thread.so.1.42.0
(gdb) bt
#0  0x00007ffff7bd1bb5 in boost::thread::start_thread() () from /usr/lib/libboost_thread.so.1.42.0
#1  0x00007ffff79869bb in USBDetector::start_hotplug_thread() ()
   from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#2  0x00007ffff7986c7e in USBDetector::start(std::vector<unsigned int, std::allocator<unsigned int> >, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >, std::vector<unsigned int, std::allocator<unsigned int> >) () from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#3  0x00007ffff7987298 in USBManagerLinux::start(std::vector<unsigned int, std::allocator<unsigned int> >, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >, std::vector<unsigned int, std::allocator<unsigned int> >, int) () from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#4  0x00007ffff79842f3 in USBManager::start(std::vector<unsigned int, std::allocator<unsigned int> >, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >, std::vector<unsigned int, std::allocator<unsigned int> >, int) () from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#5  0x00007ffff79a03d6 in DriverMain::start(int) ()
   from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#6  0x00007ffff79a1e32 in sixenseInit ()
   from /home/joschu/Downloads/sixenseSDK_linux_OSX/samples/linux_x64/sixense_simple3d/libsixense_x64.so
#7  0x0000000000400d0d in main () at /home/joschu/bulletsim/src/hydra/hi.cpp:6

如果我改变项目链接的方式,我发现我的其他库最终调用了 sixense 的 boost::thread。

有什么办法可以解决这个问题吗?

最佳答案

It looks like they statically link to boost::thread

你没有说他们将 boost::thread 静态链接到什么。我假设他们将其链接到 libsixense_x64.so

有几种通用的方法可以避免名称冲突:

  1. 请 sdk 开发人员改正他们的行为。他们应该做的是静态提升链接并隐藏这个事实,例如通过使用 -fvisibility=hidden 进行编译,并且只导出他们想要的界面,而不是导出一切(这听起来是他们所做的)。
  2. 如果您不能强制 sdk 开发人员清理,您可以通过 dlopen 使用 RTLD_LOCAL 绑定(bind)加载他们的 sdk 库。这使得使用 sdk 有点尴尬,但应该将其符号从全局动态链接器命名空间中保留下来。
  3. 最后,为了完整起见:如果您在 Linux 上(您的消息暗示但没有说明),您可以使用 dlmopen 将 sdk 加载到一个完全独立的动态链接器命名空间中。与选项 2 相比,我看不出有任何优势,而且有几个缺点。

关于c++ - 由于第三方库的名称冲突导致的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10152153/

相关文章:

c++ - 如何使用C++转发引用正确指定noexcept?

c++ - 线程与进程

android - 在 Android 中,如何强制 native 代码使用我的共享库版本,而不是系统的?

c++ - 如何让 gcc 或 ld 报告 undefined symbol 但不失败?

c - "Program received signal SIGSEGV , Segmentation fault” 尝试使用递归获取所有3字符组合的关键字时

c++ - 433 接收器 Arduino if 语句

c++ - 使用 Qt 在 C++ 中进行线程串口通信

c++ - 链接错误在 32 位 XP 机器上构建 64 位 Qt 应用程序

c++ - 如何使用 gdb 找出对象实例化的位置?

C指针-Segment错误的解决办法是什么