如何链接无下划线编译的Fortran库与带下划线库(MUMPS+Matlab MKL)
解决MinGW编译MUMPS链接Matlab MKL BLAS/LAPACK的符号不匹配问题
最佳方案:用链接器脚本做符号映射(无需重编译)
MinGW链接器支持通过脚本直接映射符号,不用修改源代码或重编译任何库,完美匹配你的需求:
- 创建一个文本文件(比如
mkl_symbols.map),按以下格式把MUMPS调用的带下划线BLAS/LAPACK符号,映射到Matlab MKL对应的无下划线符号:_dgemm = dgemm; _dgesv = dgesv; _dsyev = dsyev; # 把链接时缺失的所有符号都按此格式补充 - 编译链接MUMPS时,将该脚本作为链接参数传入:
或者在Makefile的ld -o mumps_solver.exe [你的目标文件集合] -L"${MATLABROOT}\extern\lib\win64\mingw64" -lmkl_rt -T mkl_symbols.mapLDFLAGS中添加-T mkl_symbols.map即可。
备选方案:局部调整编译下划线选项
如果链接器脚本维护起来麻烦,可仅对MUMPS中直接调用BLAS/LAPACK的接口文件使用-fno-underscoring编译,其余文件保持默认:
- 定位MUMPS源码中所有调用BLAS/LAPACK的模块(比如
dmumps_struc.f90、mumps_common.f90等) - 编译这些文件时单独添加
-fno-underscoring选项:gfortran -c -fno-underscoring dmumps_struc.f90 - 其余文件正常用默认选项编译,最后直接链接Matlab的MKL库即可。
不推荐的方案:手动补符号或重复打包MKL
手动补全缺失符号工作量极大且易出错;打包重复MKL库会增加程序体积,还可能引发符号冲突,完全没必要采用。
内容的提问来源于stack exchange,提问作者Patrick Kwok
相关产品推荐
相关产品推荐

