libyuv windows x64编译方法

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

https://cmake.org/download/

本人下载的是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文件中.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值