编译安装deal.II 9.5.0-pre时BLAS/LAPACK符号检查失败求助
解决deal.II 9.5.0-pre编译时BLAS/LAPACK符号检查失败的问题
根据你提供的CMakeError.log信息,问题核心是链接阶段缺失依赖库,而非BLAS/LAPACK本身未安装,以下是针对性解决建议:
1. 补全pthread与Fortran链接依赖
日志中出现pthread_setaffinity_np和_gfortran_concat_string未定义引用,说明CMake在检查BLAS/LAPACK时,没有自动链接pthread线程库和gfortran运行时库。修改CMake命令,在LAPACK_LIBRARIES中补充这两个库:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/dealII \ -DDEAL_II_WITH_UMFPACK=ON \ -DDEAL_II_WITH_LAPACK=ON \ -DLAPACK_LIBRARIES="/usr/local/lib64/liblapack.a;/usr/local/lib64/libblas.a;/usr/lib64/libpthread.so;/usr/lib64/libgfortran.so" \ -DDEAL_II_WITH_MKL=OFF \ ./..
如果优先使用系统的OpenBLAS(路径/usr/lib64/libopenblas.so),可以替换手动指定的blas/lapack库——OpenBLAS通常已内置pthread支持:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/dealII \ -DDEAL_II_WITH_UMFPACK=ON \ -DDEAL_II_WITH_LAPACK=ON \ -DBLAS_LIBRARIES="/usr/lib64/libopenblas.so" \ -DLAPACK_LIBRARIES="/usr/lib64/liblapack.so" \ -DCMAKE_EXE_LINKER_FLAGS="-lpthread -lgfortran" \ -DDEAL_II_WITH_MKL=OFF \ ./..
2. 禁用MKL检测
日志提到MKL_SYMBOL_CHECK因缺少mkl.h失败,说明CMake默认尝试检测MKL但你并未安装。显式关闭MKL支持,避免干扰BLAS/LAPACK的检测流程:
-DDEAL_II_WITH_MKL=OFF
3. 让CMake自动查找BLAS/LAPACK(推荐)
不要手动硬编码库路径,利用CMake自带的FindBLAS/FindLAPACK模块自动查找,同时指定BLAS供应商为OpenBLAS:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/dealII \ -DDEAL_II_WITH_UMFPACK=ON \ -DDEAL_II_WITH_LAPACK=ON \ -DBLA_VENDOR=OpenBLAS \ -DCMAKE_EXE_LINKER_FLAGS="-lpthread -lgfortran" \ -DDEAL_II_WITH_MKL=OFF \ ./..
4. 验证库依赖完整性
手动检查你指定的BLAS/LAPACK库是否依赖其他库:
# 静态库用nm查看符号 nm /usr/local/lib64/libblas.a | grep pthread_setaffinity_np # 动态库用ldd查看依赖 ldd /usr/lib64/libopenblas.so
如果静态库确实依赖pthread,必须在CMake中显式链接对应的库文件。
内容的提问来源于stack exchange,提问作者Goenitzer
相关产品推荐
相关产品推荐

