【发布时间】:2013-03-14 14:21:29
【问题描述】:
我们的项目(在 C++ 中)需要链接到 boost regex,所以我们只需找到正确编译的 libboost_regex_1.45.0 并告诉 g++ 链接到它。编译成功,我们只需按预期获得正确的可执行文件。问题是,每次我们尝试运行可执行文件时,它都会在进入main() 例程之前崩溃。
使用gdb附加生成的core文件,backtrace命令显示__bultin_strlen期间存在分段错误,已解决为strlen@@GLBC_2.2.5。
由于我们的可执行文件链接到多个动态库,readelf -s 被用来识别有问题的符号,它归结为libboost_regex。但是引用的符号已经存在于 RHEL6 系统文件夹 /lib64/libc.so 中。
问题是,我们如何才能让 boost 正则表达式正常工作?
- 操作系统:RHEL6.2
- GCC: 4.3.2 /
libstdc++6.0.13 - Boost 库由完全相同的工具集构建 -
user-config.bjam是自定义的
由于各种原因,静态链接对我们来说不是一个好的选择。
符号信息和ldd信息附在https://gist.github.com/skyscribe/5184622
【问题讨论】:
-
你看过完整的回溯吗?没有正在运行的构造函数或静态初始化?
-
首先确保用于构建程序的编译器版本与 boost_regex 匹配。您是否从源代码编译了 boost,或者您是否安装了预编译版本?
-
@JoachimPileborg 不,回溯只是指向 boost 正则表达式库 - 一些 RAII 特定于 Boost 库的详细名称空间的东西,与应用程序逻辑无关。只要链接了这个库,即使是一个非常简单的 hello world 程序也可能崩溃。不过,其他库也可以正常工作,例如
libboost_thread,它不引用像xxx@@GLIBC_2.2.5这样的符号 -
请逐字发布回溯,以及
ldd /path/to/libboost_regex.so的输出。 -
请显示文件
test.cpp的第 28 行(及其周围的行)。这就是崩溃的根源,在您的main函数中。