一、源码编译安装clang-llvm:
sudo apt install gcc-multilib git clone --branch llvmorg-17.0.5 --recursive https://github.com/llvm/llvm-project ##version_number可在官网查看,例如:17.0.5 cd llvm-project mkdir build cd build cmake ../llvm -DCMAKE_C_COMPILER=/usr/bin/gcc-11 -DCMAKE_CXX_COMPILER=/usr/bin/g++-11 -DCMAKE_CXX_LINK_FLAGS="-Wl,-rpath,/usr/lib64 -L/usr/lib" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld;lldb;clang-tools-extra;polly;libclc" -DCMAKE_INSTALL_PREFIX=/usr/local/llvm-17 -DLLVM_ENABLE_RUNTIMES="libc;libunwind;libcxxabi;libcxx;compiler-rt;openmp" -DLLVM_BINUTILS_INCDIR=/usr/include |
##可根据llvm proje目录下的projec添加ENABLE_PROJECTS LLVM_BINUTILS_INCDIR 表示编译LLVMgold.so,编译链接需要用到次插件,该so需要提前安装bintuils并指定bintuils的头文件目录,具体参考LLVM gold插件安装步骤_gold链接器如何安装?-CSDN博客,在编译binutils的时候可能会报错以下信息:
此报错需要sudo apt install texinfo.
二、源码安装gcc
1、error: size ‘-1’ of array ‘assertion_failed__1163’ is negative
342 | typedef char IMPL_PASTE(assertion_failed_##_, line)[2*(int)(pred)-1]
解决办法:Fix sanitizer-common build with glibc 2.31 · llvm/llvm-project@947f969 · GitHub
按照上面链接的方式,修改源码对应源码即可编译通过。
2、使用gcc-7编译yuvsiq,最后链接OpenCV库的时候失败:
通过 strings "/lib/x86_64-linux-gnu/libstdc++.so.6" | grep LIBC 此版本对应gcc-11的glibc版本
在查看 strings "/home/share/gcc-7/lib64/libstdc++.so.6" | grep LIBC 此版本对应gcc-7的glibc版本
发现gcc-7没有GLIBCXX_3.4.26 GLIBCXX_3.4.30等等这些libc版本,由此可知道OpenCV库是有gcc-11编译的,所以在使用gcc-7去编译链接的时候,导致找不到对应版本的glibc而出错。
使用 readelf -s /usr/local/lib/libopencv_gapi.so.4.8.0 | grep -oP "GLIBCXX_[\d\.]*" | sort | uniq 查看对应的opencv库需要的GLIBC版本
解决办法:使用gcc-7编译OpenCV,通常情况高版本的gcc可以兼容低版本的gcc
3、使用clang编译Linux平台的yuvsiq报错omp.h not found
查看Omp.h not found - OpenMP - LLVM Discussion Forums
可以发现可能是在编译clang的时候没有启用和安装 openmp导致,在编译llvm的时候启用openmp即可。
4、使用gcc-7编译opencv的时候可能会遇到一些莫名其妙的错误,比如找不到xxx的定义之类的
可以使用以下cmake命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DENABLE_CXX11=ON ..
其中ENABLE_CXX11=ON表示开启C11特性,可以规避一些编译问题。