Ubuntu 16.04.4安装CBLAS遇ranlib文件格式识别错误
解决Ubuntu 16.04.4上CBLAS编译时ranlib格式错误的问题
嘿,我看到你在编译CBLAS时碰到了ranlib: /home/ubuntu/CBLAS/lib/cblas_LINUX.a: File format not recognized这个头疼的错误,咱们一步步来排查解决:
1. 先确认依赖的BLAS库是否正常
CBLAS是基于BLAS的包装库,所以首先得确保你指定的BLLIB = /home/ubuntu/BLAS-3.8.0/blas_LINUX.a是个完整有效的静态库:
- 切换到BLAS目录:
cd /home/ubuntu/BLAS-3.8.0 - 先清理之前的编译残留:
make clean - 重新编译BLAS:
make - 验证生成的库文件:执行
file blas_LINUX.a,正常输出应该是类似blas_LINUX.a: current ar archive。如果显示不是归档文件,说明BLAS编译失败了——这种情况先检查依赖是否装全,Ubuntu 16.04下可以跑sudo apt-get install build-essential gfortran补全编译工具链。
2. 检查CBLAS的目标库文件状态
错误里的cblas_LINUX.a大概率是没生成、生成不完整或者是个空文件:
- 切换到CBLAS目录:
cd /home/ubuntu/CBLAS - 先彻底清理旧编译文件:
make clean - 确认
lib目录存在,没有的话手动创建:mkdir -p lib - 核对
Makefile.in里的CBLIB路径,你设置的/home/ubuntu/CBLAS/lib/cblas_LINUX.a是对的,但要确保编译过程能写入这个目录(权限没问题的话就不用管)。
3. 修正Makefile.in里的归档工具参数
我注意到你设置了ARCH = gcc和ARCHFLAGS = -shared -o,这是个关键问题:
gcc是C编译器,而创建静态库.a需要用归档工具ar,所以把ARCH改成arARCHFLAGS = -shared -o是生成动态库.so的参数,静态库需要用cr参数来创建归档,所以调整这两个参数:
这样ARCH = ar ARCHFLAGS = cr RANLIB = ranlibar会创建静态库,之后ranlib才能正确索引它。
4. 重新编译CBLAS
做完上面的调整后,执行make重新编译。如果还是报错,仔细看编译过程中更早的输出——很多时候这种格式错误是前面某个源文件编译失败,导致生成的.a文件不完整,把那些具体的编译错误信息找出来就能定位问题。
另外提一句,Ubuntu 16.04其实有预编译的CBLAS包,如果你不想折腾手动编译,直接跑sudo apt-get install libcblas-dev就能一键安装,省心又不容易出错。
内容的提问来源于stack exchange,提问作者Vasanti




