内容简介:最近接到个任务,就是把根据官方文档,官方提供了一个名为
最近接到个任务,就是把 OpenCL
的 .cl
代码编译成 Vulkan
程序。
根据官方文档, Vulkan 1.0
支持 OpenCL 1.0/2.1
的代码直接编译成 Vulkan
程序。
官方提供了一个名为 KhronosGroup/SPIR
的开源项目,支持 OpenCL
编译成 SPIR-V
代码的功能( Vulkan
使用 SPIR-V
)。
这个 工具 使用的 LLVM 的版本非常古老,编译的时候问题多多。
这个工具在 macOS Mojave(10.14.2)
系统上使用 gcc 8.2.0
的编译流程如下:
$ git clone http://llvm.org/git/llvm.git llvm $ cd llvm $ git checkout --track -b release_32 remotes/origin/release_32 $ cd llvm/tools $ git clone https://github.com/KhronosGroup/SPIR clang $ cd clang # 官方要求检出 spir_12 分支,但是貌似执行完成 clone 之后,就已经在这个分支上了 # git checkout --track -b spir_12 remotes/origin/spir_12 $ cd ../.. $ mkdir build $ cd build # 只能使用GCC编译,不能使用自带的LLVM编译 $ brew install gcc $ brew unlink gcc $ brew cleanup $ brew link gcc # 指定路径 $ export PATH=$(brew --prefix)/bin:$PATH # 重定向编译工具到我们安装的GCC版本,版本号从brew的命令行中查询得到,如果安装了多个版本,请手工指定这个参数 $ export BREW_GCC_VER=$(brew list --versions | grep gcc | sed 's/\([0-9]\).*/\1/g' | tr -cd "[0-9]") $ export CC="$(brew --prefix)/bin/gcc-$BREW_GCC_VER" $ export CXX="$(brew --prefix)/bin/g++-$BREW_GCC_VER" # 链接库目录 $ export CMAKE_LIBRARY_PATH=$(brew --prefix)/lib $ export CMAKE_INCLUDE_PATH=$(brew --prefix)/include # 不能使用 GCC 引入的 ar,ranlib 这两个程序,这两个程序处理的库不能被ld正常链接,我们需要使用macOS官方提供的 ar,ranlib # 出现这个问题的原因在于macOS上的GCC并没有提供ld,其实即使提供ld也不能正常执行,原因在于macOS与GNU格式不兼容,无法正常链接 # 因此只能使用系统自带的链接工具,链接工具只认识系统自带的 ar,ranlib 转换后文件的格式 $ mv /usr/local/bin/ranlib /usr/local/bin/ranlib2 $ ln -s /usr/bin/ranlib /usr/local/bin/ranlib $ mv /usr/local/bin/ar /usr/local/bin/ar2 $ ln -s /usr/bin/ar /usr/local/bin/ar # 不能编译成动态库,原因在于这个版本的代码存在循环依赖的问题,动态库无法成功编译,只能编译成静态库 $ cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_CXX_FLAGS="-march=native" $ make
如果使用 Xcode Version 10.1 (10B61)
编译会报告如下错误:
[ 14%] Building CXX object lib/Analysis/CMakeFiles/LLVMAnalysis.dir/LazyValueInfo.cpp.o /Users/xx/llvm/lib/Analysis/LazyValueInfo.cpp:998:14: error: no matching member function for call to 'insert' worklist.insert(worklist.end(), succ_begin(ToUpdate), succ_end(ToUpdate)); ~~~~~~~~~^~~~~~ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:713:14: note: candidate function not viable: no known conversion from 'llvm::succ_iterator' (aka 'SuccIterator<llvm::TerminatorInst *, llvm::BasicBlock>') to 'std::__1::vector<llvm::BasicBlock *, std::__1::allocator<llvm::BasicBlock *> >::size_type' (aka 'unsigned long') for 2nd argument iterator insert(const_iterator __position, size_type __n, const_reference __x); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:724:9: note: candidate template ignored: requirement '!__is_forward_iterator<SuccIterator<TerminatorInst *, BasicBlock> >::value' was not satisfied [with _InputIterator = llvm::SuccIterator<llvm::TerminatorInst *, llvm::BasicBlock>] insert(const_iterator __position, _InputIterator __first, _InputIterator __last); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:734:9: note: candidate template ignored: requirement 'is_constructible<value_type, typename iterator_traits<SuccIterator<TerminatorInst *, BasicBlock> >::reference>::value' was not satisfied [with _ForwardIterator = llvm::SuccIterator<llvm::TerminatorInst *, llvm::BasicBlock>] insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/vector:705:14: note: candidate function not viable: requires 2 arguments, but 3 were provided iterator insert(const_iterator __position, const_reference __x); ^ 1 error generated. make[2]: *** [lib/Analysis/CMakeFiles/LLVMAnalysis.dir/LazyValueInfo.cpp.o] Error 1 make[1]: *** [lib/Analysis/CMakeFiles/LLVMAnalysis.dir/all] Error 2 make: *** [all] Error 2
如果编译的时候出现如下错误信息:
ld: warning: ignoring file ../../lib/libLLVMTableGen.a, file was built for archive which is not the architecture being linked (x86_64): ../../lib/libLLVMTableGen.a ld: warning: ignoring file ../../lib/libLLVMSupport.a, file was built for archive which is not the architecture being linked (x86_64): ../../lib/libLLVMSupport.a ................................... ld: symbol(s) not found for architecture x86_64 ...................................
则说明编译的时候,没有指定使用 macOS
官方提供的 ar
, ranlib
,链接这两个程序到 Xcode
提供的即可。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- WebAssembly与代码的编译
- OpenCL代码编译成Vulkan代码的工具clspv
- 50 行代码的 HTML 编译器
- Scala Native 0.2.0 发布,将 Scala 代码编译成本机代码
- Scala Native 0.3.0 发布,将 Scala 代码编译成本机代码
- Scala Native 0.2.0 发布,将 Scala 代码编译成本机代码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。