How to build OpenBLAS for iPhone iOS

OpenBLAS 介绍

OpenBLAS是由中科院软件所并行软件与计算科学实验室发起的基于GotoBLAS2 1.13 BSD版的开源BLAS库高性能实现.

OpenBLAS源码地址

OpenBLAS地址:https://github.com/xianyi/OpenBLAS/tree/release-0.2.21

build OpenBLAS for iPhone

1.下载源码,下载之后如下图所示:



2.找到c_check文件,在这段代码的后面

$cross_suffix = "";
     if (dirname($compiler_name) ne ".") {
         $cross_suffix .= dirname($compiler_name) . "/";
     }
     if (basename($compiler_name) =~ /([^\s]*-)(.*)/) {
         $cross_suffix .= $1;
     }

添加如下代码:

 $cross_suffix = "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/";

3.新建一个openBlasBuild.sh文件,写入如下代码:

TOOLCHAIN_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
SYSROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk
make TARGET=ARMV8 BINARY=64 HOSTCC=clang CC="$TOOLCHAIN_PATH/clang -isysroot $SYSROOT_PATH -arch arm64 -miphoneos-version-min=8.0 -O2" NOFORTRAN=1 libs

参数说明TOOLCHAIN_PATH xcode安装目录,SYSROOT_PATH iOS SDK目录,make编译,TARGET目标架构(可以是ARMV8,x86_64等),-arch arm64可以是arm64、armv7、arm7s。
4.把openBlasBuild.sh执行文件放到刚刚下载的OpenBLAS源码根目录下,如下图所示:


赋予openBlasBuild.sh文件可执行权限:

chmod a+x openBlasBuild.sh

然后运行:

./openBlasBuild.sh

等待编译完成,在OpenBLAS源码根目录下就生成了libopenblas_armv8p-r0.2.20.a文件。

如何使用

刚刚生成的是一个libopenblas_armv8p-r0.2.20.a静态库,需要的头文件如下图所示:(在OpenBLAS源码目录下都可以找得到这些头文件)



把这个文件夹加入到iOS工程引头文件就可以使用了,注意需要把用到的那个类的后缀名改为.mm,这样xcode才可以编译通过,因为这个库是c++写的。

编译支持模拟器x86_64

需要支持模拟器的把步骤3的代码改为:

TOOLCHAIN_PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
SYSROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
make TARGET=x86_64 BINARY=64 HOSTCC=clang CC="$TOOLCHAIN_PATH/clang -isysroot $SYSROOT_PATH -arch x86_64 -miphoneos-version-min=8.0 -O2" NOFORTRAN=1 libs

新下载一份OpenBLAS源码,按照234步骤编译。通过lipo -create -output命令把两个.a合在一块就可以同时支持模拟器与真机了(iPhone5s以上机型与模拟器)。
两个.a文件合并完成了,还需要合并用到的头文件中的config.h文件,每次生成.a文件都会生成对应的config.h文件。config.h里面是定义的宏,我们用#if !TARGET_IPHONE_SIMULATOR预编译宏区别是真机还是模拟器。把两个config.h文件的内容合并为一个如下图所示:


制作好的openBlas库git地址:https://github.com/PingshengZhao/openBlasForiOS

你可能感兴趣的:(How to build OpenBLAS for iPhone iOS)