CXXLD libdcp_plugin.la
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS_+0x2c): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_RU1'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS_+0x39): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `transaction clone for operator new[](unsigned long long)'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z35_txnal_cow_string_C1_for_exceptionsPvPKcS_+0x5d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_memcpyRtWn'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z23_txnal_cow_string_c_strPKv+0x1): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_RU8'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z23_txnal_sso_string_c_strPKv+0x1): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_RU8'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z20_txnal_cow_string_D1Pv+0x5): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_RU8'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_Z20_txnal_cow_string_D1Pv+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_addUserCommitAction'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_ZGTtNSt11logic_errorC1EPKc+0x2e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_memcpyRnWt'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_ZGTtNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x2e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_memcpyRnWt'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_ZGTtNSt11logic_errorC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x36): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `_ITM_RU8'
/usr/lib/gcc/x86_64-w64-mingw32/7.3-win32/libstdc++.a(cow-stdexcept.o):(.text$_ZGTtNSt11logic_errorD0Ev+0x1a): additional relocation overflows omitted from the output
collect2: error: ld returned 1 exit status
Makefile:13212: recipe for target 'libdcp_plugin.la' failed
make[4]: Entering directory 'vlc-3.0.8-win64-gcc8.3/win32/modules'
CXX stream_out/chromecast/libstream_out_chromecast_plugin_la-cast.lo
In file included from vlc-3.0.8-win64-gcc8.3/contrib/x86_64-w64-mingw32/include/google/protobuf/stubs/common.h:40,
from stream_out/chromecast/cast_channel.pb.h:9,
from ../../extras/package/win32/../../../modules/stream_out/chromecast/chromecast.h:45,
from ../../extras/package/win32/../../../modules/stream_out/chromecast/cast.cpp:33:
vlc-3.0.8-win64-gcc8.3/contrib/x86_64-w64-mingw32/include/google/protobuf/stubs/port.h:56:7: warning: "_MSC_VER" is not defined, evaluates to 0 [-Wundef]
#if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
^~~~~~~~
In file included from ../../extras/package/win32/../../../modules/stream_out/chromecast/chromecast.h:45,
from ../../extras/package/win32/../../../modules/stream_out/chromecast/cast.cpp:33:
stream_out/chromecast/cast_channel.pb.h:17:2: error: #error This file was generated by an older version of protoc which is
#error This file was generated by an older version of protoc which is
^~~~~
stream_out/chromecast/cast_channel.pb.h:18:2: error: #error incompatible with your Protocol Buffer headers. Please
#error incompatible with your Protocol Buffer headers. Please
^~~~~
stream_out/chromecast/cast_channel.pb.h:19:2: error: #error regenerate this file with a newer version of protoc.
#error regenerate this file with a newer version of protoc.
^~~~~
Makefile:25318: recipe for target 'stream_out/chromecast/libstream_out_chromecast_plugin_la-cast.lo' failed
第一次尝试在linux下编译windows的程序,踩了不少坑,特此记录一下。
VLC本身比较难编译,看了很多中文的教程,都吐槽说官方教程不靠谱,但我编译到最后,发现还是官方教程最靠谱。照着官方教程做下来,坑是最少的。 此处附上官方教程地址: https://wiki.videolan.org/Win32Compile/
一开始使用的是ubuntu 16.04,发现很多依赖包版本太老,就换成了18.04。 安装的是Mingw-w64环境,编译64版本。 这里注意官方教程有一句话:
而18.04默认安装的mingw是5.0.3,但对应的gcc7.3,编译到后面会出现问题,建议先升级到19.04的6.0.0。 具体升级方法看后文。 如果不想浪费时间,一定要先升级! 此处可能把ubuntu换成19.04更好。但因为一开始不知道,ubuntu还是使用18.04,只是升级了mingw到19.04的版本。
首先编译第三方库,注意因为编译的是3.0.8版本的VLC,必须使用Manually built方式,不能使用Prebuilt方式。 一路安装下来,如果提示缺少包,直接apt安装即可。大部分依赖都可以用这种方式安装。 如果遇到提示安装meson的版本太低,则可以卸载apt安装的版本,然后用pip3安装即可。
一个比较坑的问题,是在编译gcrypt的时候,提示syntax error:
原因是configure.ac里,写死了一些git的操作。而vlc编译的源码,是tar包,没有git的相关信息,导致编译失败。具体可以参考https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=814954。
修改configure.ac,跳过git操作即可。
另一个比较坑的问题,是在编译glew的时候,提示找不到依赖库:
查了很久才发现,是“-L/mingw/lib”的问题。在windows下用mingw编译,路径就是“/mingw/lib”,但是,在linux下编译,路径就不是这个了。 首先使用x86_64-w64-mingw32-ld命令,通过SEARCH_DIR确定mingw的lib路径:
可以看到,路径是“/usr/x86_64-w64-mingw32/lib”。 查到路径后,修改glew/config/Makefile.mingw文件,把里面的“/mingw/lib”修改成“/usr/x86_64-w64-mingw32/lib”,就可以继续编译了。
编译完第三方库,按照教程,继续编译VLC。 但一部分插件会无法编译,错误如下:
这是一个存在于6和7版本gcc的bug,gcc8已经修复。 详细信息可以查看论坛:https://forum.videolan.org/viewtopic.php?t=144693 而18.04安装的gcc版本是7.3,所以会碰到这个bug。 修复方法是升级gcc,或者修改libstdc++的os_defines.h文件,并重新编译工具链。 这里我采用的是升级gcc7到gcc8的方法。 卸载所有mingw的包,直接下载安装ubuntu 19.04的mingw安装包即可。 可以直接使用包名去搜索,很容易就能搜索到下载地址。此处不提供下载地址。 注意mingw的gcc包换了,那对应的mingw包也要换,不然头文件会冲突。
替换上述6个包后,必须从头开始,从第三方库开始编译,不然也会出现问题。T_T... 如果还需要编译32位的vlc,则还需要安装以下几个包:
安装方法是:
另外,在编译的时候,如果系统安装了protobuf,则需要检查是不是3.1.0版本,不然会出现以下问题:
就是vlc需要用到的protobuf版本和系统安装的版本不一致。 运行命令可以检查是否安装了其他版本的protobuf:
检查后,系统的确安装了protobuf,需要卸载:
sudo apt autoremove libprotoc10 libprotobuf10 protobuf-compiler
注意这里会把protobuf-compiler卸载掉,会导致第三方库里的projectM无法编译。 需要自己编译安装protobuf的3.1.0版本,简单的方法是:安装好之后,继续需要从头开始,从第三方库开始编译T_T...
一切顺利的话,vlc就编译好了。 然后打包:
$ make package-win-common
因为我的源码是直接下载的压缩包,里面没有hrtfs目录下的文件,所以不能打包。 从git下载后,放到对应目录,再运行打包命令就可以了。 打包完成后,里面多了一个目录vlc-3.0.8,比起直接安装的vlc,里面的dll都带了调试信息,也多了一个sdk的目录,里面包括头文件和lib文件。 这是用来二次开发的,如果不需要,可以运行其他打包命令。至此,vlc算是编译完成了。 花了2天的时间才搞定,整体来说难度不小。 主要还是要沉下心来,遇到一个问题解决一个,才能编译成功。
后续还要进行二次开发,有问题再更新把。