libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,,支持SSE、AVX、NEON等SIMD指令加速.VS 2015 WIN64等编译出来的库无法使用SIMD指令,效率大大降低!
网上提供的办法都是基于gclient进行代码下载,由于google仓库在国外,翻墙需要花费大量人力物力,经过研究可以直接用clang来编译libyuv,特供大家参考.
1.安装clang
下载地址:https://releases.llvm.org/download.html#3.7.0
Clang for Windows (64-bit) (.sig)
需要将LLVM的BIN目录添加到环境变量中以便于命令可以运行clang
安装完成以后可能提示缺少头文件,所以需要下载mingw64
2.安装mingw64
离线安装包x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z
注意CPU架构选择x86_64,原因就是clang也使用的是该架构编译的
将mingw64下面的bin目录添加到环境变量中
mingw安装完成后查看clang的版本如下:
3.安装cmake
本人下载的是3.17.0
4.下载libyuv
https://github.com/lemenkov/libyuv
5.创建新的cmake工程 命名为libyuv_clang,然后创建目录src include lib等目录
1).将下载到libyuv的代码source所有代码全部拷贝到src中
2).将下载到libyuv的代码include所有代码拷贝到include中
3).lib可以添加def文件 .def文件格式定义在此不再累述
4).编写CMakelist.txt 如下:
cmake_minimum_required(VERSION 2.8)
SET (CMAKE_C_COMPILER "clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "clang++")
SET (CMAKE_CXX_FLAGS "-Wall -std=c++11")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "llvm-ar")
SET (CMAKE_LINKER "llvm-ld")
SET (CMAKE_NM "llvm-nm")
SET (CMAKE_OBJDUMP "llvm-objdump")
SET (CMAKE_RANLIB "llvm-ranlib")
project(yuv)
#find_package(LLVM REQUIRED CONFIG)
SET(CMAKE_BUILD_TYPE Release)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/OutPutlib)
#set(CMAKE_CXX_STANDARD 11)
set(CMAKE_VERBOSE_MAKEFILE ON)
include_directories(
${PROJECT_SOURCE_DIR}/include
${LLVM_INCLUDE_DIRS}
)
#add_definitions(${LLVM_DEFINITIONS})
set(libyuv_source
${PROJECT_SOURCE_DIR}/src/compare.cc
${PROJECT_SOURCE_DIR}/src/compare_common.cc
${PROJECT_SOURCE_DIR}/src/compare_gcc.cc
${PROJECT_SOURCE_DIR}/src/compare_mmi.cc
${PROJECT_SOURCE_DIR}/src/compare_msa.cc
${PROJECT_SOURCE_DIR}/src/compare_neon64.cc
${PROJECT_SOURCE_DIR}/src/compare_neon.cc
${PROJECT_SOURCE_DIR}/src/compare_win.cc
${PROJECT_SOURCE_DIR}/src/convert_argb.cc
${PROJECT_SOURCE_DIR}/src/convert.cc
${PROJECT_SOURCE_DIR}/src/convert_from_argb.cc
${PROJECT_SOURCE_DIR}/src/convert_from.cc
${PROJECT_SOURCE_DIR}/src/convert_jpeg.cc
${PROJECT_SOURCE_DIR}/src/convert_to_argb.cc
${PROJECT_SOURCE_DIR}/src/convert_to_i420.cc
${PROJECT_SOURCE_DIR}/src/cpu_id.cc
${PROJECT_SOURCE_DIR}/src/mjpeg_decoder.cc
${PROJECT_SOURCE_DIR}/src/mjpeg_validate.cc
${PROJECT_SOURCE_DIR}/src/planar_functions.cc
${PROJECT_SOURCE_DIR}/src/rotate_any.cc
${PROJECT_SOURCE_DIR}/src/rotate_argb.cc
${PROJECT_SOURCE_DIR}/src/rotate.cc
${PROJECT_SOURCE_DIR}/src/rotate_common.cc
${PROJECT_SOURCE_DIR}/src/rotate_gcc.cc
${PROJECT_SOURCE_DIR}/src/rotate_mmi.cc
${PROJECT_SOURCE_DIR}/src/rotate_msa.cc
${PROJECT_SOURCE_DIR}/src/rotate_neon64.cc
${PROJECT_SOURCE_DIR}/src/rotate_neon.cc
${PROJECT_SOURCE_DIR}/src/rotate_win.cc
${PROJECT_SOURCE_DIR}/src/row_any.cc
${PROJECT_SOURCE_DIR}/src/row_common.cc
${PROJECT_SOURCE_DIR}/src/row_gcc.cc
${PROJECT_SOURCE_DIR}/src/row_mmi.cc
${PROJECT_SOURCE_DIR}/src/row_msa.cc
${PROJECT_SOURCE_DIR}/src/row_neon64.cc
${PROJECT_SOURCE_DIR}/src/row_neon.cc
${PROJECT_SOURCE_DIR}/src/row_win.cc
${PROJECT_SOURCE_DIR}/src/scale_any.cc
${PROJECT_SOURCE_DIR}/src/scale_argb.cc
${PROJECT_SOURCE_DIR}/src/scale.cc
${PROJECT_SOURCE_DIR}/src/scale_common.cc
${PROJECT_SOURCE_DIR}/src/scale_gcc.cc
${PROJECT_SOURCE_DIR}/src/scale_mmi.cc
${PROJECT_SOURCE_DIR}/src/scale_msa.cc
${PROJECT_SOURCE_DIR}/src/scale_neon64.cc
${PROJECT_SOURCE_DIR}/src/scale_neon.cc
${PROJECT_SOURCE_DIR}/src/scale_win.cc
${PROJECT_SOURCE_DIR}/src/video_common.cc)
set(SOURCE_FILES ${libyuv_source})
#add_library(yuv SHARED ${SOURCE_FILES} ${PROJECT_SOURCE_DIR}/lib/libyuv.def)
add_library(yuv SHARED ${SOURCE_FILES})
target_link_libraries(yuv -fPIC -Wl,-Bsymbolic ${llvm_libs})
上述CMakeLists.txt C++11标准需要写到CMAKE_CXX_FLAGS 中不能采用set(CMAKE_CXX_STANDARD 11)
如果采用set(CMAKE_CXX_STANDARD 11) 会报如下错误:
\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits/std_abs.h:102:3: error:
support for type '__float128' is not yet implemented
abs(__float128 __x)
如果查找不到clang编译器,请将clang的bin目录添加到环境变量中
然后创建build目录
在目录中输入命令行:cmake -G "MinGW Makefiles" .. 正确运行截图如下:
在开始编译之前,先将mingw64/bin中mingw32-make.exe复制一份改名为make.exe
然后在命令行中输入make 开始编译,编译完成后如下:
dll以及.a文件生成在OutPutlib 目录中
该.a文件可以直接被VS编译器识别,也可以将其改成lib文件,如果需要自定义接口导出,请将接口填写在def文件中.