Linux 和 Android 下 VLC 都已经初具雏形了,优化和bug方面最近没什么思路,所以准备先试着交叉编译到Windows下试试。
官方参考指南:Win32Compile
更:个人编译脚本(待优化):项目仓库
1 前期准备
1.1 交叉编译环境
向Windows环境下编译vlc的选择还是比较灵活的,一般有下面三种:
- MinGW + Linux
- MYSYS + MinGW + Windows
- Cygwin + Windows
※ [不推荐]如果在Linux下要先安装好MinGW依赖:
you need mingw-w64 version 5.0.1 to compile it.
32bit:
# apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-tools
64bit:
# apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64-tools
[推荐] 直接install之后mingw的目录和文件会很乱,这里推荐一个很不错的mingw环境搭建脚本:项目地址:MinGW,具体使用方法参见README,有个小小的问题就是生成对应系统后在该系统目录下会有一个同名的子文件夹,要手动合并一下。
※ Windows下不建议继续使用Cygwin或者MSYS(都太旧不更新)
※ Windows MSYS2 安装:
- 下载对应版本的MSYS2:下载地址
- 按引导完成安装
- 执行pacman -Syu (键入三次y,完成后关闭终端)
- 重新打开终端,执行pacman -Su
1.2 VLC 编译环境
编译前必须要准备的工具有下列几项:
- lua (5.2)
- all autotools: libtool, automake, autoconf, autopoint, make, gettext, pkg-config
- qt4-dev-tools, qt5-default (or qt4-default if qt plugin build fails)
- git, subversion cmake, cvs if you want to rebuild contribs
- wine-dev for creating Win32 packages
- zip [for creating .zip package], p7zip [for .7z package], nsis [for .exe auto-installer], bzip2 [for 'make prebuild]
安装的命令:
# apt-get install lua5.2 libtool automake autoconf autopoint make gettext pkg-config
# apt-get install qt4-dev-tools qt5-default git subversion cmake cvs
# apt-get install wine64-development-tools libwine-dev zip p7zip nsis bzip2
# apt-get install yasm ragel ant default-jdk protobuf-compiler dos2unix
Win+MSYS2: 这里顺便给一下在win下的依赖参考:
pacman -S git subversion cvs automake autoconf libtool m4 make gettext pkg-config mingw-w64-i686-lua findutils mingw-w64-i686-headers yasm patch
Ps:查询包的指令:pacman -Ss [keyword] 查询已安装的包的:pacman -Q
如果仍然提示缺失lua或者ffmpeg的话,推荐直接下载二者源码然后编译安装,话说可以把usr/local加进PKG_CONFIG_PATH里:
$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
1.3 获取VLC源码
源码获取可以使用git直接clone:
$ git clone http://git.videolan.org/git/vlc.git vlc
※ 如果是在Windows平台下一定要设置git的结束符形式
$ git config core.autocrlf=false
也可以到VLC的资源站上找自己想要的版本,这里给一下VLC资源传送门:
- Github:纯VLC项目地址
- Explore GitLab: 有很多其他人做的分享项目
- FTP site:后退到上一级有惊喜
- Another FTP:另一个下载站
Ps: 这里面也可以直接找到Linux-Win的contrib,后面会用到。
2 开始编译
首先进入VLC的目录中,如果之前没有安装过任何VLC需要的第三方库,这里可能会花点时间。
注意:下面提到的所有 HOST-TRIPLET 需要按照实际需要替换成 i686-w64-mingw32 或者 x86_64-w64-mingw32,具体情况需要看自己情况,比如非要用msys的话就是x86_64-pc-msys(由要用的gcc决定,还是mingw最好...其他的会有很多依赖问题)
2.1 预编译
官方推荐的预编译方法(简单+快)是下面的命令:
注意:VLC 3.0及以上不适用此方法!
$ mkdir -p contrib/win32
$ cd contrib/win32
$ ../bootstrap --host=HOST-TRIPLET
$ make prebuilt
在make prebuilt的时候会下载一个contrib包,如果命令行下载较慢或者容易中断的话可以回到上面提到的资源网手动下载:传送门。如果是手动下载的话记得解压到 vlc/contrib/x86_64-w64-mingw32 目录。
当然,如果你富有冒险精神、愿意探索、并且有大把大把时间可以挥霍,官方还给了一个正规编译方法(VLC3.0+只能使用此方法):
$ sudo apt-get install subversion yasm cvs cmake ragel autopoint
$ mkdir -p contrib/win32
$ cd contrib/win32
$ ../bootstrap --host=HOST-TRIPLET
$ make fetch
$ make
这个方法会一个一个安装需要的依赖,然后编译安装到项目的内部环境中,比较耗费时间,但也有利于手动调整某些部分,比如某个依赖编译出错了可以直接自己把他编进去。
※如果使用VLC-3.0+,有些依赖版本可能提示太低(protobuf...),需要手动编译进去
※某些moc文件可能有些问题(比如dialogs_provider.moc.cc里多了一个case...)
如果是在64位下编译,有些东西我们要删掉(vlc/contrib/win32路径下):
$ rm -f ../HOST-TRIPLET/bin/moc ../HOST-TRIPLET/bin/uic ../HOST-TRIPLET/bin/rcc
如果HOST-TRIPLET不是i686-w64-mingw32的话需要修复一下contrib路径:
$ ln -sf 'HOST-TRIPLET' ../i686-w64-mingw32
2.2 继续怼
回到VLC根目录下。
首先执行bootstrap,建立一下依赖树:
$ ./bootstrap
重新建立一个win32文件夹用于编译:
$ mkdir win32 && cd win32
把我们的路径声明一下,下面路径需要修改(这里开始用的只有内部环境了,有遇到问题可以考虑下这个原因):
$ export PKG_CONFIG_LIBDIR=$HOME/vlc/contrib/HOST-TRIPLET/lib/pkgconfig
$ export PKG_CONFIG_PATH_CUSTOM=$PKG_CONFIG_LIBDIR (for Archlinux only)
进行正式的编译(找不到文件的话注意下是否路径不对或者上面export不对):
$ ../extras/package/win32/configure.sh --host=HOST-TRIPLET --build=x86_64-pc-linux-gnu
同样某些情况下我们需要按照manually configure来。使用这种方式可以更加灵活得添加一些自定义的东西。
$ ../configure --host=HOST-TRIPLET --build=x86_64-pc-linux-gnu
Linux下一个不该出现的错误:
configure: error: You need 32-bits luac when using lua from contrib.
想法:这里我们用到的所有交叉编译的依赖都来自contrib里(所以不要相信他们说的apt-get install安装...),在这个contrib下我们找到了用到的x86_64-w64-mingw32,在bin文件夹下可以看到有luac.exe(由预编译下载的contrib提供)。按理说官方给的依赖应该是完整且正确的,所以这个错误不应该出现。
思路:看到很多人直接把lua报错关掉了,简单粗暴...当然不用lua的情况下是明智的。但想解决这个问题肯定不能这样,找到了一个很神奇的操作:重新编译一个32位的交叉项目然后借用他的luac。
尝试:如果想用上面的方法解决的话大概没必要重新编译,直接下载一个32位的依赖contrib(传送门)然后把bin目录下的luac.exe拷贝过来。while, not work。
解决:手动编译lua32并安装到contrib里,或者安装lua32后把pkgconfig路径加进去(PATH/LIBRARY)
sudo dpkg --add-architecture i386 && apt-get update && apt-get install lua5.2:i386
完成编译之后就是 make 一下项目
根据cpu内核的个数指定一下'x'
$ make -jx
make的时候出现的错误很有可能源自之前的任何一步,对于初学者来说Debug本身就是一项很大的考验,尤其是在编译非官方指定版本的时候...总之经过了三个星期断断续续的调试,Finally...Done!
3 生成Windows包
make结束后就可以正式打包给Windows平台了,可供选择的命令有以下几种:
Command | Description |
---|---|
make package-win-common | Creates a subdirectory named vlc-x.x.x with all the binaries. You can run VLC directly from this directory. |
make package-win-strip | Same, but will create 'stripped' binaries (that is, smallest size, unusable with a debugger). |
make package-win32-7zip | Same, but will package the directory in a 7z file. |
make package-win32-zip | Same, but will package the directory in a zip file. |
make package-win32 | Same, but will also create an auto-installer package. You must have NSIS installed in its default location for this to work. |
当然make-package-win的一系列方法其实有很多(见下表),可以按需求进行选择。
Commands | Commands |
---|---|
package-win32 | package-win32-webplugin-common |
package-win32-7zip | package-win32-xpi |
package-win32-cleanup | package-win32-zip |
package-win32-crx | package-wince |
package-win32-debug | package-win-common |
package-win32-debug-7zip | package-win-install |
package-win32-debug-zip | package-win-npapi |
package-win32-exe | package-win-sdk |
package-win32-release | package-win-strip |
但在Linux下有一个很难受的地方就是:vlc -> win的时候需要nsis version ≥ 3,而nsis在ubuntu系列上最新只支持到了2.51……
在官网找了一圈确实刨出来了3.0+的源码,考虑之后下载了较为稳定的3.0.1版本,当然也可以下载其他对应的版本(传送门)
源码需要用scons编译,具体步骤是:
指定zlib路径:$ export ZLIB_W32=...
进行编译:$ scons PREFIX=... install
但这些都是面向Windows编译的,所以肯定需要重新配置编译然后又要消耗掉大量的时间,如果选择关掉这个检测(vlc/win32/Makefile:2478)...后面还是会出现 *.nis 文件错误。
最终只能被迫打包成zip格式的文件
==================
其他编译问题
syntax error, unexpected aKNOWNTYPE, expecting tIMPORT
【解决参考】https://stackoverflow.com/questions/38859332/cross-compiling-vlc-for-windows-errors-widl-compiling-dxgi1-2-idl-wine-headerwrl/client.h: no such file or dictionary 等多项头文件问题
【解决参考】https://forum.videolan.org/viewtopic.php?t=137580