gpt4 book ai didi

c++ - 将 gcc 构建的 Boost 链接到英特尔 C++ 编译程序时静态初始化期间的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:03 24 4
gpt4 key购买 nike

我有一个 Ubuntu 13.04 系统,安装了最新的 SVN 版本的 Boost C++ 库。 Boost 安装是使用系统的 native gcc 版本 v4.7.3 构建的。我非常广泛地使用 Boost,当我使用 gcc 编译时它工作得很好;我已经使用了其中的许多,包括 Boost.Thread(我将在下面详细讨论),没有任何问题。

如果我尝试使用与已安装的 Boost 库链接的英特尔 C++ 编译器(我个人使用 v13.x 系列中的几个不同版本)构建程序,就会出现问题。当我这样做时,程序启动后立即出现段错误;它似乎发生在 Boost.Thread 库的静态初始化期间。这是一个简单的示例程序:

#include <boost/version.hpp>
#include <boost/thread.hpp>

int main()
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
}

我使用 Intel C++ 编译它:

icpc test.cc -lboost_thread -lboost_system -I/path/to/boost/inc/dir -L/path/to/boost/lib/dir

正如我所说,当我运行生成的程序时,我几乎立即遇到了段错误。通过 gdb,从段错误点开始的堆栈跟踪如下:

#0  0x00007ffff79b6351 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>() () from ./libboost_thread.so.1.55.0
#1 0x00007ffff79b02e1 in _GLOBAL__sub_I_thread.cpp () from ./libboost_thread.so.1.55.0
#2 0x00007ffff7de9876 in call_init (l=l@entry=0x7ffff7ff9a10, argc=argc@entry=1,
argv=argv@entry=0x7fffffffe0b8, env=env@entry=0x7fffffffe0c8) at dl-init.c:84
#3 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>,
argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55
#4 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8)
at dl-init.c:133
#5 0x00007ffff7ddb68a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#6 0x0000000000000001 in ?? ()
#7 0x00007fffffffe391 in ?? ()
#8 0x0000000000000000 in ?? ()

不是很有启发性,但它显然在 libboost_thread.so 的初始化过程中死亡。如果我重建包含调试符号的 Boost,那么我会得到稍微好一点的图片:

#0  shared_count (r=..., this=0x7ffff7bbc5f8 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep+8>)
at ./boost/smart_ptr/shared_ptr.hpp:328
#1 shared_ptr (this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>) at ./boost/smart_ptr/shared_ptr.hpp:328
#2 exception_ptr (ptr=..., this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>)
at ./boost/exception/detail/exception_ptr.hpp:53
#3 boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_> () at ./boost/exception/detail/exception_ptr.hpp:130
#4 0x00007ffff79b02e1 in __static_initialization_and_destruction_0 (__initialize_p=<optimized out>, __priority=<optimized out>) at ./boost/exception/detail/exception_ptr.hpp:143
#5 _GLOBAL__sub_I_thread.cpp(void) () at libs/thread/src/pthread/thread.cpp:767
#6 0x00007ffff7de9876 in call_init (l=l@entry=0x7ffff7ff9a10, argc=argc@entry=1, argv=argv@entry=0x7fffffffe0b8, env=env@entry=0x7fffffffe0c8) at dl-init.c:84
#7 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55
#8 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8) at dl-init.c:133
#9 0x00007ffff7ddb68a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#10 0x0000000000000001 in ?? ()
#11 0x00007fffffffe391 in ?? ()
#12 0x0000000000000000 in ?? ()

我不清楚是什么静态/全局对象导致了问题的发生,所以我不确定如何继续。我在 v13.x 系列中使用多个 Boost 版本和几个不同版本的英特尔 C++ 编译器复制了此行为,这是我目前可以访问的唯一版本。我已经尝试了每一个编译器排列(即我已经用 gccicpc 构建了 Boost,并且我也用两者构建了我的测试应用程序);唯一失败的排列是 Boost 是使用 gcc 构建的,而我的测试应用程序是使用 icpc 构建的。在所有其他情况下,测试应用程序都会成功运行。

话虽如此,您可能会得到显而易见的答案:

  • 为什么不使用 icpc 重建 Boost 并收工呢?根据我的实验,这种方法似乎很有效,但我有客户喜欢使用icpc 构建我的软件。这些相同的客户可能安装了 Linux 发行版提供的 Boost 包;他们对用于生成该包的构建环境没有任何控制权(并且很可能,它是使用 gcc 编译的)。因此,如果可以支持这种混合编译器配置,那将是最佳选择。

有人对我如何解决这个静态初始化问题有任何建议吗?

最佳答案

这是一个远景,但是...如果您的 PATH 中的 g++ 与用于构建 Boost 库的那个不同,请删除它或将 -gxx-name/usr/bin/g++ 传递给 icpc。 (英特尔编译器会自行适应它认为您正在使用的 GCC 版本。-gxx-name 让您强制执行此问题。)

好吧,这可能没有帮助。

在 Intel Composer XE 2013 SP1 之前不支持 Ubuntu 13.04。编译器版本 14.0.0。查看"System Requirements" section of the Release Notes并将其与 same section for the last 13.x release 进行比较.

Intel 的目标绝对是与 GCC 的链路兼容。如果您可以在受支持的 Linux 版本的全新安装上重现此问题,您应该能够提交支持票并修复它。

关于c++ - 将 gcc 构建的 Boost 链接到英特尔 C++ 编译程序时静态初始化期间的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com