Fork me on GitHub

VLC源码编译—linux下交叉编译x86和x64版本(附采坑记录)

VLC源码编译—linux下交叉编译x86和x64版本(附采坑记录)

  1. 官方文档地址:
    https://wiki.videolan.org/Win32Compile/#Obtaining_the_toolchain
  2. github地址:
    https://github.com/videolan/vlc

本文参考地址:

  1. VMware Ubuntu安装详细过程(非常靠谱):

    https://blog.csdn.net/stpeace/article/details/78598333

  2. 流媒体02:Linux交叉编译VLC-2.2.1:

    https://higoge.github.io/2015/07/17/sm02/index.html

  3. vlc-2.2.4 交叉编译 UbuntuX64_1604_Desktop 编译windows版本vlc:

    https://blog.csdn.net/longji/article/details/52304590


1、编译环境

win10,ubuntu 16.0.4,linux 64位,Vlc 2.2.4,VMware Workstation 14。

下载地址:

ubuntu下载地址:

http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

VLC32位依赖库下载地址:

https://download.csdn.net/download/u012534831/10737727

VLC64位依赖库下载地址:

https://download.csdn.net/download/u012534831/10737729

原始下载地址:(过墙):

http://download.videolan.org/pub/videolan/contrib/x86_64-w64-mingw32

mingw32 和 64 原始下载地址:

http://ftp.jp.debian.org/debian/pool/main/m/mingw-w64/

VLC2.2.4源码下载地址:

https://blog.csdn.net/wangyequn1124/article/details/69247220

2、准备工作

编译VLC源码需要一些软件的支持,在编译过程中也需要用到一些软件。

  • 在linux64位下,网上都是apt-get安装软件,本人推荐使用aptitude命令安装,倘若没有,可先安装aptitude,因为aptitude可以帮助解决软件的依赖关系,给出合理建议,询问你是否采纳,避免很多麻烦。
1
$ sudo apt-get install aptitude
1
$ sudo apt-get install vim

3、编译依赖软件安装

ctrl+alt+T,打开命令行,依次执行下面的命令:

1
2
3
4
5
6
7
8
9
10
11
$ sudo aptitude install gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-tools # 对应win32版本,即在32位机器上编译64位
$ sudo aptitude install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64-tools # 对应win64版本 即在64位机器上编译64位
$ sudo aptitude install lua5.2 libtool
$ sudo aptitude install libtool automake autoconf autopoint make gettext
$ sudo aptitude install pkg-config
$ sudo aptitude install qt4-dev-tools qt5-default
$ sudo aptitude install git subversion
$ sudo aptitude install cmake cvs
$ sudo aptitude install wine64-development-tools libwine-dev zip p7zip nsis bzip2 # wine-dev for creating Win32 packages
$ sudo aptitude install yasm ragel ant default-jdk protobuf-compiler dos2unix
$ sudo aptitude update

安装过程中可能会出现Configuring ttf-mscorefonts-installer的配置页面,按tab后,选择ok或者yes,一路回车即可。

4、执行脚本

将如下内容保存到脚本jb.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh
# This script enforces statically linking of libgcc, libstdc++-6, and libpthread,
# without needing to rebuild gcc and mingw-w64 from scratch.
# -static-libgcc -static-libstdc++ flags can not be used in a libtool build system,
# as libtool removes flags that it doesn't understand.
move() {
[ -f $1 ] || return 1
mkdir -p old/
mv -v $* old/
return 0
}
for x in i686 x86_64
do
library_path_list=`$x-w64-mingw32-gcc -v /dev/null 2>&1 | grep ^LIBRARY_PATH|cut -d= -f2|sort|uniq`
IFS=':'
for i in $library_path_list
do
cd $i
move libstdc++-6.dll libstdc++.dll.a libgcc_s.a libgcc_s_sjlj-1.dll && ln -s libgcc_eh.a libgcc_s.a
move libpthread.dll.a libwinpthread.dll.a
move libwinpthread-1.dll
[ -d ../bin ] && cd ../bin && move libwinpthread-1.dll
done
done
exit 0

然后执行脚本:

1
$ sh j8.sh

5、解压源码

1
2
$ tar xJvf vlc-2.2.4.tar.xz
$ cd vlc-2.2.4/

6、准备预编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
##(推荐,速度慢)方法 1(64位)(32位修改三元组中x86_64为i686), 下面三行会自动下载三元组对应的依赖库,但是很慢,
mkdir -p contrib/x86_64 && cd contrib/x86_64
../bootstrap --host=x86_64-w64-mingw32
make prebuilt
## 方法2:手动构建,官网说很费时间,也很容易出错,就不举例了
##-------------------------------------------
##(推荐,速度快)方法3:
$ cd contrib/
## 32位编译 第三方依赖库见上面 VLC64位依赖库下载地址,移动依赖库到contrib目录下
$ mkdir win32; cd win32
$ mv ~/vlc-contrib-i686-w64-mingw32-latest.tar.bz2 vlc-contrib-i686-w64-mingw32-latest.tar.bz2
## 64位编译
$ mkdir x86_64; cd x86_64
$ mv ~/vlc-contrib-x86_64-w64-mingw32-latest.tar.bz2 vlc-contrib-x86_64-w64-mingw32-latest.tar.bz2
##开始预编译32位
$ ../bootstrap --build=i686-w64-mingw32
$ make prebuilt
##开始预编译64位
$ ../bootstrap --build=x86_64-w64-mingw32
$ make prebuilt

预编译完成后退回源码根目录(vlc-2.2.4)

1
$ cd ../../

7、准备编译源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ./bootstrap
## 32位
$ mkdir win32 && cd win32
## 64位
$ mkdir x86_64 && cd x86_64
## 32位
export PKG_CONFIG_LIBDIR=$HOME/vlc-2.2.4/contrib/i686-w64-mingw32/lib/pkgconfig
## 64位
export PKG_CONFIG_LIBDIR=$HOME/vlc-2.2.4/contrib/x86_64-w64-mingw32/lib/pkgconfig
##利用configure 脚本进行编译
## ../extras/package/win32/configure.sh为源码解压得到的win32编译脚本
## 在linux 64位下编译windows32位,这个过程,会有一个wine更新过程,自动完成的
$ ../extras/package/win32/configure.sh --host=HOST-i686-w64-mingw32 --build=x86_64-pc-linux-gnu
## 在linux 64位下编译windows64位
$ ../configure --host=HOST-x86_64-w64-mingw32 --build=x86_64-pc-linux-gnu
##See '../configure --help' for more information.

8、构建

1
2
3
4
5
6
##配置完成,开始构建
$ make
##或者
$ make –j4 ##(加速make,4核CPU)

9、打包

1
2
3
4
$ make package-win-common # 生成 _win32 和 vlc-2.2.4 目录
$ wine ./vlc-2.2.4/vlc.exe # 可以启动vlc.exe
$ make package-win32-7zip # 生成 vlc-2.2.4-win64.7z 和 symbols-2.2.4。拷贝到windows系统,解压后运行。这一步会下载npapi-vlc源码到x86_64/npapi-vlc下并编译,会覆盖原有的x86_64/npapi-vlc文件。需要vpn。
$ make package-win32-debug-7zip # 生成 vlc-2.2.4-win64-debug.7z

10、踩坑记录

1、倘若在安装依赖软件的时候报错:

UBuntu安装软 件时提示:
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
E: 无法找到软件包 build-essential

1
2
3
4
## 此问题解决方法:
## 先执行
$ sudo aptitude update
## 然后再安装软件即可

2、安装依赖软件时QT报错,见官网说明 : 因此换成qt4-default即可。

qt4-dev-tools, qt5-default (or qt4-default if qt plugin build fails)

3、sh脚本运行不过,是因为linux编码和windows不同,linux换行是/n,windows是/r/n。因此需要安装dos2unix软件,转换格式后再运行脚本。

1
2
3
$ sudo aptitude install dos2unix
$ dos2unix jb.sh
$ sh jb.sh

4、执行xxx时有可能报错:error: LibVLC requires mingw-runtime version 3.15 or higher, or mingw-w64 version 3.0 or higher! 是由于mingw版本太低,重新安装高版本即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 参考文章:https://blog.csdn.net/mengzhengjie/article/details/46680281
## 到 http://ftp.jp.debian.org/debian/pool/main/m/mingw-w64/ 下载需用的软件包,注意64位的需要修改i686为(x86-64)
##(选择下载的版本要大于3.15以上,可选用3.2的)
## mingw-w64-common_3.2.0-3_all.deb
## mingw-w64-i686-dev_3.2.0-3_all.deb
## 下载后安装 mingw-w64-i686 软件包:
$ dpkg-i mingw-w64-common_3.2.0-3_all.deb
$ dpkg-i mingw-w64-i686-dev_3.2.0-3_all.deb
## 最后,重装MinGW的gcc/g++支持:
$ aptitude install gcc-mingw-w64-i686
$ aptitude install g++-mingw-w64-i686
$ aptitude install gfortran-mingw-w64-i686
$ aptitude install mingw-w64-tools

5、configure: error: You need 32-bits luac when using lua from contrib

1
2
3
4
5
## 即使安装了32位lua也可能出现此错误,此时可以修改/vlc/configure文件,
## 注释掉 #as_fn_error $? "You nedd 32-bits luac when using lua from contrib."
## 我用的:
$ aptitude install lua5.2:i386

6、libavutil versions 55 and later are not supported

1
2
3
4
5
6
## 参考原文:https://blog.csdn.net/freeman1975/article/details/50572374
## 先:
$ aptitude install -y libdbus-1-dev lua5.1 liblua5.1-dev libmad0-dev libavcodec-dev libavformat-dev libswscale-dev libpostproc-dev liba52-dev libxcb1-dev libxcb-shm0-dev libxcb-xv0-dev libx11-xcb-dev libgl1-mesa-dev libqt4-dev libgcrypt11-dev
## 再:
$ ./configure --disable-lua --disable-mad --disable-avcodec --disable-avformat --disable-swscale --disable-postproc --disable-a52 --disable-mkv
## (禁用某些插件, 在后面的步骤中如果还碰到类似错误,说某些插件找不到,也可以用disable屏蔽)

7、configure: error: Package requirements (xcb) were not met

1
2
3
## No package 'xcb' found
## 解决:
$ sudo aptitude install libxcb-composite0-dev

8、No package ‘alsa’ found. alsa-lib 1.0.24 or later required

1
2
## 解决:
$ sudo apt-get install libalsa-ocaml-dev

~~ EOF ~~