在Linux(而不是OSX)中链接时发生库冲突
Library conflict when linking in Linux, but not OSX
我已经在OSX笔记本电脑上成功编译并执行了一些代码,现在正试图将项目转移到运行Scientific Linux的HPC上。
代码似乎可以正确编译和链接,但当我运行可执行文件时,它会中止:
抛出'H5::DataSpaceIException'实例后调用terminate
中止(核心转储(
我在应该是程序的第一行执行的地方放了一条print语句,但这一行永远不会到达,即程序在第一行执行之前就终止了。
我已经将问题隔离到一个特定的库中,即在没有库的情况下编译时,一切都正常(除了依赖库的临时删除的函数(。当包含库时,它会编译,但会如上所述中止。我已经将同一个库链接到其他使用它的可执行文件:是否与我链接到的其他库有冲突?
我对C++很陌生,对这种调试也很陌生。以下是程序中止时gdb的回溯:
#0 0x00002aaaad82a1f7 in raise () from /lib64/libc.so.6
#1 0x00002aaaad82b8e8 in abort () from /lib64/libc.so.6
#2 0x00002aaaad337ac5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#3 0x00002aaaad335a36 in ?? () from /lib64/libstdc++.so.6
#4 0x00002aaaad335a63 in std::terminate() () from /lib64/libstdc++.so.6
#5 0x00002aaaad335c83 in __cxa_throw () from /lib64/libstdc++.so.6
#6 0x00000000020ec521 in H5::DataSpace::getConstant() ()
#7 0x0000000000da8dff in _GLOBAL__sub_I_H5DataSpace.cpp ()
#8 0x00000000024ecdcd in __libc_csu_init ()
#9 0x00002aaaad816b95 in __libc_start_main () from /lib64/libc.so.6
#10 0x0000000000dab7a7 in _start ()
(gdb)
我真的不知道从哪里开始解释这个。我想把它比作我笔记本电脑上工作版本的回溯。如果我在main上放了一个断点,我知道它在Linux版本中不会执行,那么运行并打印一个我得到的回溯:
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000100003490 antsRegistration`ants::antsRegistration(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::basic_ostream<char, std::__1::char_traits<char> >*)
frame #1: 0x000000010000306e antsRegistration`main + 62
frame #2: 0x00007fff5abc3115 libdyld.dylib`start + 1
实际上,它看起来更像源代码,但并不能帮助我识别任何差异。欢迎在这里提供任何见解或调试策略。
我在将OpenGL程序从OSX移植到Windows时也遇到过类似的问题。OSX只是做了一些不同的事情,至少在OpenGL世界中是这样。最后,我不得不根据编译的目标进行OSX和Win特定的函数调用。
如果我有这个问题,我会检查在"故障"库中实现的函数,也许会逐一介绍它们,并试图找出造成损坏的调用。这是在与主程序隔离的情况下进行的——我的意思是在一个单独的最小程序中,很明显没有其他副作用发生。
然后,你就可以更好地阅读有问题的特定功能(如果仍然需要,也可以针对一个非常具体的问题(
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 协议缓冲区的静态链接会导致与现有符号冲突
- 在Linux(而不是OSX)中链接时发生库冲突
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 尝试解决链接器警告:默认库'MSVCRT'与使用其他库冲突
- 创建链接列表时发生访问冲突错误
- 链接 : 警告 LNK4098: 默认库 'MSVCRT' 与其他库的使用冲突;使用 /NODEFAULTLIB:Library
- 内存冲突:SIGSEGV 和"找不到虚拟表的链接器符号..."
- 链接时间优化与多线程支持冲突
- 依赖项上的c++动态链接可能会导致冲突
- 双链接列表中存在访问冲突
- c++:不同链接库中定义的相同函数的运行时冲突
- 内联函数在链接期间发生冲突