2012-04-14 116 views
1

我正在尝试使用sixense的专有sdk(驱动程序用于游戏控制器)。它看起来像静态链接到boost :: thread。我的应用程序和它的一些依赖项也使用boost :: thread,并且我得到了一个segfault。由于来自第三方库的名称冲突引起的段错误

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。

有没有解决此问题的方法?

回答

2

看起来他们静态链接到提高::线程

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

有避免名称冲突几种常见方法:

  1. 询问SDK开发者自己的行为。他们应该所做的是静态链接提升和隐藏这个事实,例如,通过使用-fvisibility = hidden进行编译,并且只导出他们预期的接口,而不是输出的一切(这听起来是他们所做的)。
  2. 如果你不能强迫sdk开发者清理,你可以通过dlopen加载他们的sdk库,并且使用RTLD_LOCAL进行绑定。这使得使用sdk有点尴尬,但应该从全局动态链接器名称空间保留它的符号。
  3. 最后,为了完整起见:如果您在Linux上(您的消息建议但未声明),则可以使用dlmopen将sdk加载到完全独立的动态链接器名称空间中。与选项2相比,我没有看到任何优势,并且存在几个缺点。
+0

没错,他们将它链接到libsixense_x64.so,它导出所有内容。感谢彻底的答复。 – John 2012-04-17 05:20:10