【问题标题】:EXEC_BAD_ACCESS in MLPACK library with -std=c++11MLPACK 库中的 EXEC_BAD_ACCESS 与 -std=c++11
【发布时间】:2014-04-26 22:51:45
【问题描述】:

我在本地环境中遇到了EXEC_BAD_ACCESS 错误(Mac OS X 10.9.2、boost 1.55.0、mlpack 1.0.8、llvm 5.1 clang-503.0.38),我已将错误范围缩小到很简单的sn-p:

#include "mlpack/methods/range_search/range_search.hpp"

int main(int argc, const char *argv[])
{
    return 0;
}

g++版本是

iMac:build dongli$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

并通过

编译sn-p
g++ -std=c++11 main.cpp -o main -lmlpack -I/usr/include/libxml2

(你可以改变你的情况)

在终端运行main会给你

iMac:build dongli$ ./main
Bus error: 10

lldb 运行它会给你更多信息

iMac:build dongli$ lldb ./main
Current executable set to './main' (x86_64).
(lldb) r
Process 79449 launched: './main' (x86_64)
Process 79449 stopped
* thread #1: tid = 0xb4a75, 0x00000001000500eb libmlpack.1.0.dylib`long double boost::math::lanczos::lanczos17m64::lanczos_sum<long double>(long double const&) + 59, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x100001d80)
    frame #0: 0x00000001000500eb libmlpack.1.0.dylib`long double boost::math::lanczos::lanczos17m64::lanczos_sum<long double>(long double const&) + 59
libmlpack.1.0.dylib`long double boost::math::lanczos::lanczos17m64::lanczos_sum<long double>(long double const&) + 59:
-> 0x1000500eb:  fstpt  (%rax)
   0x1000500ed:  fldt   0x26c8d(%rip)             ; .memset_pattern99 + 1296
   0x1000500f3:  fstpt  0x10(%rax)
   0x1000500f6:  fldt   0x26c94(%rip)             ; .memset_pattern99 + 1312

如你所见,它指向我boost::math::lanczos::lanczos17m64::lanczos_sum,但我不知道是什么问题。

但是当-std=c++11 不存在时,不会发生错误。我还尝试通过homebrew 重新安装boost--c++11

提前致谢!

编辑:

我只安装了一个boost

iMac:~ dongli$ ls /usr/local/Cellar/boost/
1.55.0

使用命令:

brew install boost --c++11

【问题讨论】:

    标签: c++11 boost exc-bad-access mlpack


    【解决方案1】:

    你可以 检查实际的共享库文件是否标记为 executable 并且运行应用程序的用户可以访问?

    不是这样,这可能意味着在运行时您会发现库的版本冲突。修复/覆盖运行时库路径,如果是,则针对相同版本的库进行编译

    【讨论】:

    • 我可以保证库的版本没有冲突,因为我只从homebrew 安装了boostmlpack
    • 那我的钱完全在权限上
    • 但是当没有-std=c++11选项时错误消失了。
    • 那么您确实安装了冲突的 Boost 版本。显然自制版本 不是 使用 --std=c++11 编译的。这将导致代码违反 ODR。参见例如stackoverflow.com/questions/4192170/…
    • @LiDong 顺便说一句,问题中缺少该信息。
    【解决方案2】:

    在我从代码中删除所有 C++11 功能(例如,initializer_list 和默认模板参数)并删除 -std=c++11 选项后,错误就消失了。我想我已经通过使用homebrew 安装了boostmlpack-std=c++11,但是错误仍然存​​在,所以我的经验是如果没有必要,不要使用新功能。

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2017-08-11
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多