MSYS2环境下编译X265

HEVC(High Efficiency Video Coding),是一种新的视频压缩标准。可以替代H.264/ AVC编码,使得保持相同质量的情况下,体积减少40%左右。目前有多种实现版本,x265则是其中之一。常用网站:

x265官网			http://www.x265.org/
代码托管			https://bitbucket.org/multicoreware/x265/
代码镜像			http://www.videolan.org/developers/x265.html。
编译好的可执行档	http://x265.ru/en/

本文提供一个在Windows平台下的MSYS2环境进行编译x265的方法.

MSYS2的下载安装,以及需要用的软件安装,请参考博文http://www.cnblogs.com/eudiwffe/p/6249630.html

必备软件:

Make					MSYS2-base自带
CMake 2.8以上版本		https://cmake.org/		(请安装windows版)
YASM 1.2及以上			http://yasm.tortall.net/
MingW-Gcc 4.8以上版本	推荐使用http://xhmikosr.1f0.de/tools/msys

注意:make已经包含在MSYS2中,无须安装;CMake请下载windows版本安装,不要使用msys2的版本;yasm用于生成汇编文件,可以手动下载并拷贝到/usr/bin/yasm.exe中,也可以使用msys2中的pacman进行在线安装;mingw-gcc推荐使用手动下载并覆盖。其中windows版cmake安装后,可能在msys2环境中找不到,需要手动添加到PATH中,具体为在bash中执行“export PATH=/cmake-winverion/:$PATH”。

x265源码下载,可以从两个代码托管中下载最新的release版本;也可以通过HG进行克隆软件仓库,具体方法在msys2中执行:

pacman -S mercurial		# 安装mercurial Hg分布式软件仓库管理
hg clone https://bitbucket.org/multicoreware/x265	# 克隆软件仓库
cd x265					# 进入到x265中
hg update stable		# 切换到稳定版本

即可。如果已经克隆了仓库,可以在x265目录下执行“hg pull && hg update stable”进行更新到最新版本。

如果windows中已经安装了TortoiseHg并且不想在msys2中再安装msys2版本的hg,可以执行“export PATH=/yourhgpath/:$PATH”将其加入到环境变量中。

编译

在编译之前,请确认一下:

$ echo $PATH
.:/c/Program Files (x86)/CMake/bin:/mingw32/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
$ which make
/usr/bin/make

$ which cmake
/c/Program Files (x86)/CMake/bin/cmake

$ which yasm
/usr/bin/yasm

$ which hg
/usr/bin/hg

如果有软件找不到或路径不对,可以手动修复。

进入build/msys后执行“./make-Makefiles.sh”进行生成生成Makefile,期间会弹出CMake对话框,一般可以点击“configure”然后“generate”即可生成Makefile,最后执行make进行编译。

执行./make-x86_64-w64-mingw32-Makefiles.sh可以生成编译64位版本x265的Makefile,在这之前,请清理编译中间文件,否则cmake不会生成新的Makefile。

MSYS2下的HG问题

如果使用的是hg克隆软件仓库的源码编译,可能会出现如下错误:

-- Found yasm: C:/msys2x86/usr/bin/yasm.exe (found version "1.3.0")
-- Found Yasm 1.3.0 to build assembly primitives
-- hg found at C:/msys2x86/usr/bin/hg
-- x265 version +-
-- The ASM_YASM compiler identification is unknown
-- Found assembler: C:/msys2x86/usr/bin/yasm.exe
-- Looking for strtok_r
-- Looking for strtok_r - not found
CMake Error at CMakeLists.txt:529 (list):
  list GET given empty list

CMake Error at CMakeLists.txt:530 (list):
  list GET given empty list

-- Looking for include file getopt.h
-- Looking for include file getopt.h - found
-- Configuring incomplete, errors occurred!
See also "C:/msys2x86/home/user/x265/build/msys/CMakeFiles/CMakeOutput.log".
See also "C:/msys2x86/home/user/x265/build/msys/CMakeFiles/CMakeError.log".

这是因为在生成Makefile之前,cmake会根据hg软件自动获取当前代码版本。如果你使用的是tortoisehg并且将其添加到PATH中了,则没有问题;如果使用的是msys2-hg(即使用Pacman在线安装mercurial),cmake将无法正确获得版本号。因为source/cmake/version.cmake中使用了“execute_process”获取版本,而windows版本的cmake只能调用原生的win执行档,msys2版本的hg使用的是Python2构建的,所以无法正常执行“execute_process”,因此需要手动获取当前x265的版本,并保存在x265/.hg_archival.txt中,以及在x265/source/cmake/version.cmake的最后部分增加部分代码,具体如下:

hg log -r. --template {node}
hg log -r. --template {node}
hg log -r. --template {branch}
hg log -r. --template {latesttag}
hg log -r. --template {latesttagdistance}

## x265/.hg_archival.txt
repo: 6dd8f6a41db17a30b5dc14218acc4065dee7f465
node: be14a7e9755e54f0fd34911c72bdfa66981220bc
branch: stable
tag: 2.2
distance: 1

## x265/source/cmake/version.cmake最后增加:
# msys hg cannot get correct version info
set(X265_LATEST_TAG "2.2")
set(X265_TAG_DISTANCE "1")
set(X265_REVISION_ID "be14a7e9755e")
set(X265_VERSION "2.2+1-be14a7e9755e")
message(STATUS "msys hg x265 version ${X265_VERSION}")

由于每次编译都需要进行上面操作,可以写一个脚本放在x265/build/msys/make-version.sh中:

#!/bin/sh
## MSYS HG cannot get repo version, so read info
## from .hgtags and save to .hg_archival

HG_TAGS="../../.hgtags"
HG_ARCHIVAL="../../.hg_archival.txt"
CMAKE_VERSION="../../source/cmake/version.cmake"
PATCH="# msys hg cannot get correct version info"
REPO=`hg log -r. --template {node}`
NODE=`hg log -r. --template {node}`
BRANCH=`hg log -r. --template {branch}`
TAG=`hg log -r. --template {latesttag}`
DISTANCE=`hg log -r. --template {latesttagdistance}`

## find current branch node and tag
cat $HG_TAGS > $HG_ARCHIVAL
while read oneline
do
	if [ "${oneline#* }" = "$TAG" ]
	then
		NODE=${oneline% *}
		break
	fi
done < $HG_ARCHIVAL

## for mercurial
## find current version.cmake end
rm -rf $CMAKE_VERSION.bak
cat $CMAKE_VERSION > $HG_ARCHIVAL
while read oneline
do
	if [ "$oneline" = "$PATCH" ]
	then
		break
	fi
	echo "$oneline" >> $CMAKE_VERSION.bak
done < $HG_ARCHIVAL
echo "$PATCH" >> $CMAKE_VERSION.bak
echo "set(X265_LATEST_TAG \"$TAG\")" >> $CMAKE_VERSION.bak
echo "set(X265_TAG_DISTANCE \"$DISTANCE\")" >> $CMAKE_VERSION.bak
echo "set(X265_REVISION_ID \"${NODE:0:12}\")" >> $CMAKE_VERSION.bak
echo "set(X265_VERSION \"$TAG+$DISTANCE-${NODE:0:12}\")" >> $CMAKE_VERSION.bak
echo "message(STATUS \"msys hg x265 version \${X265_VERSION}\")" >> $CMAKE_VERSION.bak
rm -rf $CMAKE_VERSION
mv $CMAKE_VERSION.bak $CMAKE_VERSION

## for release
echo repo: $REPO > $HG_ARCHIVAL
echo node: $NODE >> $HG_ARCHIVAL
echo branch: $BRANCH >> $HG_ARCHIVAL
echo tag: $TAG >> $HG_ARCHIVAL
echo distance: $DISTANCE >> $HG_ARCHIVAL

以后当更新源码后,再次编译时,首先执行./make-version.sh,生成patch,然后进行编译即可。

时间: 2024-10-11 13:48:11

MSYS2环境下编译X265的相关文章

在虚拟机linux环境下编译windows版adb fastboot

原文出自:http://blog.chinaunix.net/uid-20546441-id-1746200.html 我根据虚拟机编译遇到的问题进行一些添加 [前提条件] Linux Android源码完整 虚拟机磁盘空间100G左右(60G用来存放代码和编译后的文件) swap 30G左右,若太小会导致在编译后提示缺失文件 [具体步骤] 理论上,只要下一个windows版本的SDK,里面就自带了fastboot和adb工具. 但我最近确实遇到了一个需要在linux下编译出windows版本的

【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse插件

目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.zip Apache Ant(TM) version 1.8.4 compiled on May 22 2012 java version "1.7.0_45" 参考文章: http://kangfoo.u.qiniudn.com/article/2013/12/build-hadoop2x

libCURL开源库在VS2010环境下编译安装,配置详解

libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 CURL开源库VS2010环境下编译安装,配置详解 一 准备 1.1 CURL官网下载地址:http://curl.haxx.se/download.html 1.2 找到源码包,我这里下载的是7.32.0版:http://curl.haxx.se/download/curl-7.32.0.zip 二 步骤 2.1 打开curl-7.32.0\

在SoCEDS环境下编译和更新preloader和uboot程序的方法

在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloader和uboot程序!以及如何去更新BOOT SD卡中的preloader和uboot! 从Terasic网站下下载的SD image是在13.1环境下编译出来的preloader和u-boot,这里会在14.0环境下重新编译并更新到SD卡中!并在inux系统下更新preloader和u-boot到SD卡

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse小工具

目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.zip Apache Ant(TM) version 1.8.4 compiled on May 22 2012 java version "1.7.0_45" 參考文章: http://kangfoo.u.qiniudn.com/article/2013/12/build-hadoop2x

Openstack 二次开发之:在windows 环境下编译Openstack-java-sdk

在windows环境下使用maven对openstack-java-sdk进行编译 编译源文件 下载源代码 git clonehttps://github.com/woorea/openstack-java-sdk.git 下载并安装gpg4win http://ftp.gpg4win.org/ 本次过程中下载的是gpg4win-2.2.2.exe 配置gpg 查看 F:\github\openstack-java-sdk>gpg --list-key gpg:C:/Users/Eric.sun

在高通平台Android环境下编译内核模块【转】

本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei-he-mo-kuai/ 高通Android环境中Linux内核会作为Android的一部分进行编译,直接使用make即可一次性从头编到尾.而有的平台比如Marvell,内核的编译操作相对比较独立,必须使用标准的内核编译命令进行单独编译.一般来说,用高通的这种方式比较傻瓜化,一步到底的感觉:而用Ma

在Linux x86_64环境下编译memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信.但是它并不提供冗余(例如,复制其hashmap条目):当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失. 说简单一点memcach