c++ - 在 Linux 中链接时发生库冲突,但在 OSX 中则不会

标签 c++ linux macos gdb linker-errors

我已经在我的 OSX 笔记本电脑上成功编译并执行了一些代码,现在正尝试将该项目转移到运行 Scientific Linux 的 HPC 上。

代码似乎可以正确编译和链接,但是当我运行可执行文件时它会中止:

terminate called after throwing an instance of 'H5::DataSpaceIException'
Aborted (core dumped)

我在应该是程序的第一个执行行的位置放置了一条打印语句,但从未到达这一行,即程序在第一行执行之前终止。

我已将问题隔离到特定的库,即在没有库的情况下编译时一切正常(除了依赖于库的临时删除的函数)。当包含该库时,它会编译但会像上面那样中止。我已将同一个库链接到其他使用它的可执行文件而没有问题:是否与我链接到的其他库有冲突?

我对 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 时遇到了类似的问题。至少在 OpenGL 世界中,OSX 只是做了一些不同的事情。最后,我不得不根据编译目标进行 OSX 和 Win 特定的函数调用。

如果我有这个问题,我会检查在“有问题的”库中实现的函数,也许会一一介绍它们并尝试找出是哪个调用造成了损害。独立于主程序执行此操作 - 我的意思是在一个单独的最小程序中,很明显没有其他副作用发生。

然后您就可以更好地阅读有问题的特定功能或功能(如果仍然需要,也可以针对非常具体的问题。)

关于c++ - 在 Linux 中链接时发生库冲突,但在 OSX 中则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622933/

相关文章:

linux - git: 'http-push' 不是 git 命令。致命:git-http-push 失败

C++创建导致段错误的新数组

c++ - 如何比较 vector ?

c++ - INT_MIN/-1 是 C++ 中定义的行为吗?

ios - Mpmovieplayercontroller video pause while clicking button for another functional

swift - 使用 swift 在 NSTableview 中创建可折叠行

php - 警告 : Calling `sha256 "digest"=> :tag` in a bottle block is deprecated! 在公式上使用 `brew style --fix`

c++ - 使用 nullptr 作为 std::unordered_map 的键有什么后果吗?

python - 从 python 脚本执行 linux shell 命令

linux - 如何限制单个 Linux 进程的内存使用而不终止进程