一种解决“使用Xcode编译IOS库,OpenMP不支持”问题的方法

本文主要参考资料

https://github.com/Tencent/ncnn/blob/master/.github/workflows/release.yml#L514

https://mac.r-project.org/openmp/

https://iscinumpy.gitlab.io/post/omp-on-high-sierra/

 

对于习惯使用OpenMP进行多线程优化的同学而言,当你需要将优化库移植到MacOS或IOS时,一般会遇到一些问题。

比如,由于使用了OpenMP,一般会在编译选项上添加-fopenmp,但是直接使用xcode编译时,会抛出

clang: error: unsupported option '-fopenmp'

因为Xcode绑定的Clang编译器是明确不使能OpenMP的。但是,我们可以通过将编译选项修改为-Xclang -fopenmp,继续编译

xxxxx: fatal error: 'omp.h' file not found
#include <omp.h>
          ^~~~~~
1 error generated.

此时的问题变成了omp.h找不到。如果此时我们随便拷贝一份omp.h头文件到工程中,会发现编译就没有问题了。但是运行时,会继续报错,错误内容大体是找不到openmp相关的函数定义。

至此,我们发现,clang的编译器本身是支持OpenMP的,只是Apple没有提供OpenMP相关库文件。

幸运的是,LLVM/Clang早已经支持了OpenMP,因此解决思路就是:安装LLVM/OpenMP。

由于我使用的MacMini无法连接互联网,因此只能通过使用其它能联网的机器下载LLVM/OpenMP源码(https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/openmp-11.0.0.src.tar.xz),然后再上传至MacMini进行OpenMP的编译。

以下内容照搬了ncnn中的做法:

tar -xf openmp-11.0.0.src.tar.xz
cd openmp-11.0.0.src
sed -i'' -e '/.size __kmp_unnamed_critical_addr/d' runtime/src/z_Linux_asm.S
sed -i'' -e 's/__kmp_unnamed_critical_addr/___kmp_unnamed_critical_addr/g' runtime/src/z_Linux_asm.S


cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install \
            -DIOS_PLATFORM=OS -DENABLE_BITCODE=0 -DENABLE_ARC=0 -DENABLE_VISIBILITY=0 -DIOS_ARCH="armv7;arm64;arm64e" \
            -DPERL_EXECUTABLE=/usr/local/bin/perl \
            -DLIBOMP_ENABLE_SHARED=OFF -DLIBOMP_OMPT_SUPPORT=OFF -DLIBOMP_USE_HWLOC=OFF ..
cmake --build . -j 2
cmake --build . --target install

其中,ios.toolchain.cmake文件也是取自ncnn源码中的toolchains文件夹。

编译完成后,IOS下需要的OpenMP相关文件就再install文件夹中了。将其添加到Xcode工程中,就能开心的将包含了OpenMP的库运行起来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值