与LAPACK和BLAS的链接会导致c++异常无法处理

MinGW: Linking with LAPACK and BLAS causes C++ exceptions to become unhandled

本文关键字:c++ 异常 处理 LAPACK BLAS 链接      更新时间:2023-10-16

情况很简单,但很奇怪。当我编译我的程序没有线性代数。o源代码(需要链接到LAPACK), c++异常被捕获和处理。当我不包括编译单元,但仍然链接到库(-llapack -lblas)时,异常被捕获并处理。但是一旦我得到它在那里(代码从它运行得很好),c++异常不再正确处理,我得到Windows崩溃处理程序"程序已经停止响应报告回总部"废话。

在这里,我阐明了这个源文件中发生的事情。我确实把它做得很简单,但我不确定它是否真的符合犹太标准。

我怀疑是调用FORTRAN例程导致c++异常停止工作。但我不知道该怎么解决这个问题。

更新:

我很高兴为这个问题找到了一个临时的解决方案:我使用MinGW的gfortran编译器直接编译我目前使用的LAPACK和BLAS例程。

链接这些对象文件到我的c++项目使用-lgfortrang++工作完美无瑕,我的异常仍然被正确处理!作为奖励,这允许我只包含我打算使用的LAPACK例程,所以现在我不再需要链接一个~4MB的库。

编辑:我想如果我静态链接一个库,它只"抓取它需要的东西",所以它是4MB在这种情况下并不重要。

我用GotoBLAS2取得了很好的结果。运行包含的脚本会生成一个针对我的机器进行优化的巨大的19MB静态库。通过简单的链接,它可以完美地工作。我所有的fortran风格调用都可以正常工作。