VLC - Windows 学习笔记(一)

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 安装:

  1. 下载对应版本的MSYS2:下载地址
  2. 按引导完成安装
  3. 执行pacman -Syu (键入三次y,完成后关闭终端)
  4. 重新打开终端,执行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资源传送门:

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格式的文件

==================
其他编译问题

  1. syntax error, unexpected aKNOWNTYPE, expecting tIMPORT
    【解决参考】https://stackoverflow.com/questions/38859332/cross-compiling-vlc-for-windows-errors-widl-compiling-dxgi1-2-idl-wine-header

  2. wrl/client.h: no such file or dictionary 等多项头文件问题
    【解决参考】https://forum.videolan.org/viewtopic.php?t=137580

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 今天下午,内心还是出现了起伏,想把这种感受写出来,但愿能缓减。内心的恐慌,额头肌肉的紧缩,整个人自我感觉有点紧,就...
    浪可阅读 133评论 0 0
  • 最近总有些伤春悲秋,看待事情的态度随着年龄的增长而变化,许多时候我们经历过,才会懂得如何自处,旁人的看法也仅仅只是...
    花吟逍遥阅读 296评论 0 0
  • 你会看见很多优秀的人,他们很厉害,甚至他们很有钱,但是他们还是一直在工作,一直在很努力的做事情,拼命的赚钱。 按照...
    刻意练习社区阅读 297评论 2 5
  • 都说,女人的重生,是从有了孩子开始的。 从前看到这句话不以为然,直到自己当了妈妈,才深有体会。 2016年年末,我...
    蒋家芮阅读 1,201评论 0 1