如何在Eigen中使用Boost BLAS?链接缺失符号问题求助
解决Eigen对接Boost BLAS的符号缺失问题
核心问题:Boost BLAS是仅头文件实现,但Eigen默认期望链接C风格BLAS库(如MKL、OpenBLAS),这类库会导出
daxpy_、dgemv_、dtrmv_这类带下划线的Fortran风格符号,而Boost BLAS并未提供这些符号的导出,因此出现链接错误。解决思路:让Eigen通过适配层直接调用Boost BLAS的C++接口,而非依赖外部BLAS库的符号,具体步骤如下:
- 编写接口适配头文件:创建一个适配文件(比如
eigen_boost_blas_adapter.h),将Eigen需要的Fortran风格BLAS符号映射到Boost BLAS的C++实现,示例代码如下:#include <boost/numeric/ublas/blas.hpp> extern "C" { // 适配daxpy_函数 void daxpy_(const int* n, const double* alpha, const double* x, const int* incx, double* y, const int* incy) { boost::numeric::ublas::blas::axpy(*n, *alpha, x, *incx, y, *incy); } // 适配dgemv_函数 void dgemv_(const char* trans, const int* m, const int* n, const double* alpha, const double* a, const int* lda, const double* x, const int* incx, const double* beta, double* y, const int* incy) { boost::numeric::ublas::blas::gemv(*trans, *m, *n, *alpha, a, *lda, x, *incx, *beta, y, *incy); } // 按需添加dtrmv_等其他缺失符号的适配 } - 调整项目包含顺序:在项目代码中,先包含上述适配头文件,再包含Eigen的头文件,确保Eigen优先使用适配的符号。
- 编译配置:编译时开启C++11及以上标准,同时添加Boost头文件路径(例如编译参数
-I/你的Boost头文件目录)。
- 编写接口适配头文件:创建一个适配文件(比如
注意事项:
- 适配时需严格核对Boost BLAS与Fortran风格BLAS的参数类型、顺序,避免因参数不匹配导致运行错误。
- 仅需要适配链接时提示缺失的符号,无需全部实现所有BLAS函数。
- 这种方式无需链接外部BLAS库,完全基于Boost的仅头文件实现运行。
内容的提问来源于stack exchange,提问作者GregReese
相关产品推荐
相关产品推荐

