編譯環境:
1、win7+vmware15+Ubuntu 18 64bit虛擬系統(16也可以)
2、gcc 7.4 (大於6即可)
3、mingw-w64 5.3.0,及其相關聯的x86-64的tool,也應該是同類的版本【最關鍵-切記】
4、jdk1.8 231
5、vlc 3.0.7.1 (github選擇這個tag進行下載)——其他版本本人編譯用同樣的環境試過,均編譯失敗
6、git最新版
7、其他完全按照官方https://wiki.videolan.org/Win32Compile/ 進行處理
8、時間:2019.10.22
9、腳本看本文后面的自動化shell腳本
結果:禁用了QT等,最后編譯成功,vlc.exe播放正常,編譯用時8小時,總共折騰時間:15天,共嘗試編譯次數:20+次,連續開機最長3天,產生文件大小,至少有150G,安裝了3個Ubuntu虛擬機。
一句話總結:vlc編譯使用了數百個lib或tool,錯綜復雜,導致編譯對tooltrain環境要求很高,往往一個tool導致失敗,有一些沒有明確提示,可謂西天取經72難。
謹以此分享給各位,希望大家少走彎路,有錯誤能查到一些相關信息,不要太寂寞(我編譯的過程,在csdn找到一個shell腳本(shell by yangxun),很有用,再次感謝,節省了大量輸入工作。其他有部分可以查到,但幾乎沒有一個有用的,很多網上都查不到任何信息)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面是編譯過程使用的一些零星記錄,包括一些重要問題的處理方法,僅供參考:
1、git clone https://github.com/videolan/vlc-3.0.git
記得不要用sudo,否則會有問題
git remote add origin https://github.com/videolan/vlc.git
2、裝mingw-w64
http://mirrors.163.com/ubuntu/pool/universe/m/mingw-w64/mingw-w64_5.0.3-1_all.deb
裝完這個之后,有錯誤提示,也不用理會
執行:
sudo apt-get -f install
會把依賴全部自動裝上
安裝其他:
apt-get install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64-tools
apt-get install lua5.2 libtool automake autoconf autopoint make gettext pkg-config
sudo apt-get install qt4-dev-tools qt5-default git subversion cmake cvs
sudo apt-get install wine64-development-tools libwine-dev zip p7zip nsis bzip2
sudo apt-get install yasm ragel ant default-jdk protobuf-compiler dos2unix
sudo apt-get install subversion yasm cvs cmake ragel autopoint
######################后記
為了安裝指定的版本,你需要使用下列指令
sudo apt-get install gcc-mingw-w64-base=5.3.1-8ubuntu3+17
sudo apt-get install gcc-mingw-w64-x86-64=5.3.1-8ubuntu3+17
sudo apt-get install g++-mingw-w64-x86-64=5.3.1-8ubuntu3+17
sudo apt-get install mingw-w64-tools=5.0.3-1
正常安裝好,/usr/lib/gcc/x86_64-w64-mingw32/會看到5.x版本的文件夾
而且這些版本在你的Ubuntu庫中不一定有,你需要添加源:
sudo gedit /etc/apt/sources.list
在打開單位文件的最后添加:
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
下面的源也可以加入:
#中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
#阿里雲源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
#清華源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
對於上述的源,一定要知道:bionic 指的是Ubuntu特定版本18版本,如果你需要的版本在其他Ubuntu版本,你需要強制改變這個名字,比如我本人在bionic版本的Ubuntu中加了xenial源,就是為了解決特定tooltrain的安裝問題,否則你的apt-get install xxx==xxxversion的命令會提示找不到這個tool的版本。
但這個配置上去,會造成混亂,把各個版本混雜在一起了,有點鋌而走險的意思了。
添加源后,不會馬上生效,你還需要:sudo apt-get install update,才會更新這些源列表到本地(這個可能會導致軟件自動更新,從而覆蓋了正確版本的mingw-w64,每次開機都會這樣,可以設置不要自動更新)
######################
3、擴展磁盤
ubuntu的磁盤擴展比較麻煩:
要先在vmware擴展磁盤大小,然后還需要在Ubuntu里面做如下工作:
安裝運行gparted
sudo apt-get install gparted
sudo gparted
然后禁用交換分區(swap of),然后刪除擴展分區,如果不能刪除,請先刪除swap分區后再操作。
完了之后就可以resize 主磁盤大小了,把主分區大小調整到總大小-2G的空間,確定后剩余2G在建立擴展分區,然后再建立swap分區即可
請參照:https://blog.csdn.net/daemon_2017/article/details/80660372
擴展后,還需要修改uuid
sudo blkid
找到第二個uuid,復制
然后修改/ets/fstab文件中對紅線部分進行修改,注意,必須是swap 分區
/ets/fstab 需要先賦予權限
准備自動化腳本
sudo sh compile-script-win.sh -a x86_64-w64-mingw32
修改main.mak:
download_pkg = ( $(call download,$(1)) || \
$(call download,$(CONTRIB_VIDEOLAN)/$(2)/$(lastword $(subst /, ,$(@)))) && echo "Please upload this package $(lastword $(subst /, ,$(@))) to our FTP" )
//連續10秒速度低於1即算失敗,連接等待時間不超過10秒
curl -Y 1 -y 10 --retry 3 --connect-timeout 10 --keepalive-time 20 --max-time 1800 -f -L -- "http://downloads.videolan.org/pub/contrib/theora/libtheora-1.1.1.tar2.xz" > "mytest.deb"
4、安裝Ubuntu18clean后重新編譯
5、重新編譯出錯
6、clean后重新編譯 缺少gperf,幸好可以apt-get
7、到了編譯vlc內部代碼的時候,最后居然發現缺少yacc sudo apt-get install -y byacc,安全過關
8、下列命令方法,可以使得Ubuntu下安裝多個gcc,並使其一個在系統范圍內生效,太帥氣了:
sudo apt install software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
這個是安裝gcc8
sudo apt install gcc-8 g++-8
但是安裝后測試版本仍然是7.0,原因是8.0沒有配置為默認編譯器,需要通過下列方法配置:
#這句slave有問題,換成后面兩句即可
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 80
//soft link cc to gcc-8,mean cc==gcc-8 這個也必要,很多地方不使用gcc而是直接使用cc命令,要創建一個cc軟連接指向gcc-8
//解決../bootstrap: cc: not found
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-8 80
sudo update-alternatives --install /usr/bin/YACC YACC /usr/bin/byacc 80
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100 \
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100 \
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-7 100 \
之后還提示BUILDCC沒有定義,可以執行export BUILDCC=/usr/bin/gcc ,但不可以直接修改configure文件,該文件總是會被覆蓋,可以命令行,也可以修改
9局部重新編譯的方法:
編譯中間結果都在:
/home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/win64/下面,這個可以復制,然后在編譯的時候先clean,再覆蓋,應該可以節省很多時間
10、一覺醒來發現Unknown option "--ranlib=x86_64-w64-mingw32-ranlib"
這個麻煩,搞了半小時,發現沒有什么問題。x86_64-w64-mingw32-ranlib 這個lib軟件是有安裝的。
后來把postproc-3b7053f46dbfe4662063345245cb00b6acbbe969.tar.xz(ctrl+f搜索到)這個gz文件刪除,果然系統開始重新下載該文件,之后順利過關
10、永遠不要在一個目錄里面編譯不同版本的,包括覆蓋,都不行###############
重新github下載最新新的3.x版本,重新建立目錄,只復制tarballs目錄過來,全新編譯
發現少了很多tool沒有裝,但是在3.0那邊根本沒有提示,說明已經編譯好的中間結果,不會再重新編譯,哪怕你覆蓋了最新版本的程序都不會變化。
11發現protobuf(protoc)系統版本為3.10.0而要求版本為3.1.0,出現錯誤終止
我修改make強制讓3.10.0通過。后果會怎樣,未可知
/home/js/vlcca/winV3/contrib/src/protobuf/rules.mak:17中,修改如下
#ifneq ($(PROTOBUF_VERSION),$(SYS_PROTOC_VERSION))
ifneq ($(PROTOBUF_VERSION),$(PROTOBUF_VERSION))
我賭高版本應該可以滿足低版本的
##################后記:這個真可以,沒什么問題,你修改掉版本的限制提示也可以通過,不一定要完全匹配。
12、configure: error: Cannot find native C99 compiler: please define BUILDCC.
在mycompile.sh 或后來的list.sh文件開頭增加
export BUILDCC=/usr/bin/gcc
13、碰到下載的git master的zip文件直接解壓沒有git倉庫的問題,導致找不到version.txt文件
git init
git remote add origin https://github.com/videolan/vlc.git
git add .
git pull
git remote update
git commit -m "abctest"
git branch --set-upstream-to=origin/master dev
#################后記:上述init,pull過程實際上是從0開始下載了。但后來發現有更簡單的方法:這個文件version.txt你可以隨便找一個copy都可以,無需重建git倉庫
最穩妥的做法是:先git clone https://github.com/videolan/vlc-3.0.git 然后會創建一個目錄,里面會生成.git隱藏文件夾(Ubuntu用ctrl+h可以查看到)
你需要復制一個該文件,然后通過ctrl+z無條件終止git clone的執行,因為這個clone要下載240mb左右的文件,斷斷續續,經常eof失敗,至少需要1小時,生命浪費不起啊。
此時最好關閉git clone的終端窗口,你會看到.git文件隨之消失。然后你就可以把你復制的那個改為原名即可。
這樣這個目錄仍然是合法的git倉庫,你只需要到github.com網站下載對應版本的zip文件下來(大概40mb,下載速度穩定,大概只需要5分鍾即可),解壓到你剛剛git clone的那個目錄。
這樣就重建完成了。
但開始如果沒有git clone得到.git目錄的話,你只能按照init,add,pull等方式慢慢處理了。
##########################
14、仍然碰到collect2: error: ld returned 1 exit status的問題
../../modules/access/dshow/crossbar.cpp:204:29: note: ‘outputPinIndex’ was declared here
LONG inputPinIndex = 0, outputPinIndex;
^~~~~~~~~~~~~~
CXXLD libdshow_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:14442: recipe for target 'libdshow_plugin.la' failed
make[4]: *** [libdshow_plugin.la] Error 1
make[4]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:29545: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:11667: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:1569: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/js/vlcca/winV3/win64'
Makefile:1454: recipe for target 'all' failed
make: *** [all] Error 2
這個問題碰到很多次,各種版本的vlc,3.07,3.08,4.0dev都是,與gcc版本沒有關系,但有mingw-w64版本密切相關,官方提示要5.0版本,就一定要滿足,否則必有問題,回想起來:這個是整個vlc編譯的最核心問題。
15、准備裝http://mirrors.163.com/ubuntu/pool/universe/f/faad2/faad_2.8.8-1_amd64.deb
http://mirrors.163.com/ubuntu/pool/universe/f/faad2/libfaad2_2.8.8-1_amd64.deb
configure: error: cannot find FAAD library
安裝后仍然提示沒有,只能disable-faad
sudo update-alternatives --install /usr/bin/FAAD FAAD /usr/bin/faac 80
########################后記,下面問題也是由於mingw-w64版本不對,記得不是gcc版本,而是gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64這個相關tooltrain的版本,一定要5.x
使用9.0出現這些問題:
../../modules/access/imem.c:264:28: warning: cast from function call of type ‘long long unsigned int’ to non-matching type ‘void *’ [-Wbad-function-cast]
sys->source.data = (void *)(uintptr_t)strtoull(tmp, NULL, 0);
^
CCLD libaccess_imem_plugin.la
CC access/sdp.lo
CCLD libsdp_plugin.la
CC access/timecode.lo
CCLD libtimecode_plugin.la
CC access/vdr.lo
CCLD libvdr_plugin.la
CC access/wasapi.lo
CCLD libaccess_wasapi_plugin.la
CC access/shm.lo
CCLD libshm_plugin.la
CXX access/dshow/libdshow_plugin_la-dshow.lo
CXX access/dshow/libdshow_plugin_la-filter.lo
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s: Assembler messages:
/tmp/ccIIAk6m.s:39: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:299: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:766: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:823: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:881: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:938: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:1619: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:2413: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
/usr/bin/x86_64-w64-mingw32-as: BFD (GNU Binutils) 2.30 assertion fail ../../../upstream/bfd/coff-x86_64.c:696
/tmp/ccIIAk6m.s:12807: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
Makefile:25238: recipe for target 'access/dshow/libdshow_plugin_la-filter.lo' failed
make[4]: *** [access/dshow/libdshow_plugin_la-filter.lo] Error 1
make[4]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:29545: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:11667: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/js/vlcca/winV3/win64/modules'
Makefile:1569: recipe for target 'all-recursive' failed
安裝最新的java https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html 下載deb到windows,然后拷貝到Ubuntu sudo dpkd -i xx.deb 安裝
/usr/lib/jvm/jdk-13.0.1/
#############后記##############
這里我下載了最新版本,以為高版本怎么都可以滿足低版本的要求,后來吃了大虧,一定要裝jdk1.8,也即jdk8
吐槽:oracle作死的節奏,下載一個jdk還要注冊,至少花費了30分鍾注冊,認證,下載,java是自由軟件,現在變得如此封閉,沒有路。其次,其網站登錄跳來跳去,機械,體驗太差,看來oracle講進入暮年了。
###########################
保存退出
# sudo gedit /etc/environment
在最后添加一行:
JAVA_HOME=/home/js/jdk1.8.0_231/
保存退出
使jdk環境變量生效
# source /etc/profile
檢查jdk是否生效
# java -version
# javac -version
js@ubuntu:$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
繼續安裝,如果是在其它終端做的上述操作,在編譯終端也須執行下:
# source /etc/profile
然后再看版本。
export JAVA_HOME=/home/js/jdk1.8.0_231/
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
export PATH=$JAVA_BIN:$PATH
保存退出
# sudo gedit /etc/environment
在最后添加一行:
JAVA_HOME="/home/js/jdk1.8.0_231/"
保存退出
sudo gedit /etc/profile
尾部添加:
export JAVA_HOME=/home/js/jdk1.8.0_231/
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/tools.jar:$JAVA_LIB/dt.jar
export PATH=$JAVA_BIN:$PATH
# source /etc/profile
###################缺少頭文件的終極處理方法#######################
一開始想把頭文件增加到path路徑,后來證實不行,查找網上可以修改CPLUS_INCLUDE_PATH等環境變量,但是悲催,vlc的腳本根本不認可
也嘗試過export臨時修改,都不行。
最后解決的辦法是:
1、找到你的include目錄,這個要根據提示缺少什么就去安裝什么,比如我這里缺少glew.h 這個要安裝glew,之后會在/usr/include/EL/這個目錄找到所有glew相關的頭文件
2、拷貝他到vlc目錄下的include目錄,為了安全期間,我還在win64/include目錄下也放了一份,這兩個目錄是整個vlc編譯都會加入的include目錄,所以,放在在這里自然會被找到。
實際上修改configure.ac或內部編譯腳本也可以,但是vlc內部的子目錄的makefile全部是運行時生成的,找到准確位置修改很難。
####################
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include
C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
export C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH
我感覺到最新的vlc需要qt5,而不是qt4,但是qt5如何安裝??試過裝了是gui版本的,根本沒用
##################后記:這個按照官方即可,實際上最要禁用disable-qt,這是我的解決方案,但后果是vlc編譯后沒有GUI界面,但不影響libvlc整體功能。
改用3.071編譯:
====================================
glew-1.7.0/doc/wglew.html
(cd glew-1.7.0 && patch -fp1) < ../../contrib/src/glew/win32.patch
patching file Makefile
patching file config/Makefile.mingw
patching file include/GL/glew.h
mv glew-1.7.0 glew && touch glew
cd glew && CC="x86_64-w64-mingw32-gcc" CXX="x86_64-w64-mingw32-g++" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" CCAS="x86_64-w64-mingw32-gcc -c" RANLIB="x86_64-w64-mingw32-ranlib" STRIP="x86_64-w64-mingw32-strip" PATH="/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/bin:/home/js/vlcca/3.0.7.1/vlc-3.0/extras/tools/build/bin:/home/js/bin:/home/js/.local/bin:/home/js/jdk1.8.0_231//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/js/Android/Sdk/tools:/home/js/Android/Sdk/platform-tools:/home/js/ndk/android-ndk-r18b" CPPFLAGS=" -I/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/include" CFLAGS=" -I/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/include -g -O2" CXXFLAGS=" -I/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/include -g -O2" LDFLAGS=" -L/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/lib " CFLAGS=" -I/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/include -g -O2 -DGLEW_STATIC" make
make[1]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/glew'
x86_64-w64-mingw32-gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -DSTATIC -o src/glew.o -c src/glew.c
x86_64-w64-mingw32-ld -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
x86_64-w64-mingw32-ld: cannot find -lglu32
x86_64-w64-mingw32-ld: cannot find -lopengl32
x86_64-w64-mingw32-ld: cannot find -lgdi32
x86_64-w64-mingw32-ld: cannot find -luser32
x86_64-w64-mingw32-ld: cannot find -lkernel32
Makefile:101: recipe for target 'lib/glew32.dll' failed
make[1]: *** [lib/glew32.dll] Error 1
make[1]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/glew'
../../contrib/src/glew/rules.mak:22: recipe for target '.glew' failed
make: *** [.glew] Error 2
最后嘗試完全使用mingw-64503
卸載:
js@ubuntu:~/vlcca/vlcgithubandroid/vlcwin64/tools/mingw-w64$ sudo apt-get autoremove gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
binutils-mingw-w64-i686 binutils-mingw-w64-x86-64 g++-mingw-w64 g++-mingw-w64-i686 g++-mingw-w64-x86-64 gcc-mingw-w64
gcc-mingw-w64-base gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 libqt5concurrent5 mingw-w64 mingw-w64-common mingw-w64-i686-dev
mingw-w64-tools mingw-w64-x86-64-dev qt5-qmake qt5-qmake-bin qtbase5-dev-tools
0 upgraded, 0 newly installed, 18 to remove and 42 not upgraded.
After this operation, 775 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 227064 files and directories currently installed.)
Removing mingw-w64 (5.0.3-1) ...
Removing g++-mingw-w64 (7.3.0-11ubuntu1+20.2build1) ...
Removing g++-mingw-w64-i686 (7.3.0-11ubuntu1+20.2build1) ...
Removing gcc-mingw-w64 (7.3.0-11ubuntu1+20.2build1) ...
Removing gcc-mingw-w64-i686 (7.3.0-11ubuntu1+20.2build1) ...
Removing binutils-mingw-w64-i686 (2.30-7ubuntu1+8ubuntu1) ...
Removing g++-mingw-w64-x86-64 (7.3.0-11ubuntu1+20.2build1) ...
Removing gcc-mingw-w64-x86-64 (7.3.0-11ubuntu1+20.2build1) ...
Removing binutils-mingw-w64-x86-64 (2.30-7ubuntu1+8ubuntu1) ...
Removing gcc-mingw-w64-base (7.3.0-11ubuntu1+20.2build1) ...
Removing libqt5concurrent5:amd64 (5.9.5+dfsg-0ubuntu2.3) ...
Removing mingw-w64-i686-dev (6.0.0-3) ...
Removing mingw-w64-x86-64-dev (6.0.0-3) ...
Removing mingw-w64-common (6.0.0-3) ...
Removing mingw-w64-tools (6.0.0-3) ...
Removing qt5-qmake:amd64 (5.9.5+dfsg-0ubuntu2.3) ...
Removing qt5-qmake-bin (5.9.5+dfsg-0ubuntu2.3) ...
Removing qtbase5-dev-tools (5.9.5+dfsg-0ubuntu2.3) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
To build vlc and its plugins, type `make', or `./compile' if you like nice colors.
----------------make2--------------------------
make all-recursive
make[1]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64'
Making all in compat
make[2]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/compat'
make all-am
make[3]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/compat'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/compat'
make[2]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/compat'
Making all in doc
make[2]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/doc'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/doc'
Making all in po
make[2]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/po'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/po'
Making all in share
make[2]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/share'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/share'
Making all in src
make[2]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/src'
GEN stamp-revision
fatal: Not a valid object name HEAD
make all-am
make[3]: Entering directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/src'
CCLD libvlccore.la
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/lib/libintl.a(printf.o): In function `libintl_vprintf':
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:138: undefined reference to `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:138:(.text+0x2a33): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:138: undefined reference to `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:138:(.text+0x2a79): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/x86_64-w64-mingw32/lib/libintl.a(printf.o): In function `libintl_vwprintf':
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:368: undefined reference to `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:368:(.text+0x56e3): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:368: undefined reference to `__imp___acrt_iob_func'
/home/js/vlcca/3.0.7.1/vlc-3.0/contrib/win64/gettext/gettext-tools/intl/../../gettext-runtime/intl/printf.c:368:(.text+0x5729): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp___acrt_iob_func'
collect2: error: ld returned 1 exit status
Makefile:2238: recipe for target 'libvlccore.la' failed
make[3]: *** [libvlccore.la] Error 1
make[3]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/src'
Makefile:1791: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64/src'
Makefile:1552: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/js/vlcca/3.0.7.1/vlc-3.0/win64'
Makefile:1437: recipe for target 'all' failed
make: *** [all] Error 2
opengl/converter.h:49:24: fatal error: GL/glew.h: No such file or director
http://mirrors.163.com/ubuntu/pool/universe/g/glew/
這個要安裝glew,然后把安裝后再/usr/include/的EL目錄拷貝到vlc源代碼的幾個include目錄下即可,其他解決方案我找了好久沒有解決問題
最后終於成功生成 vlc3.071版本的exe程序,我以為自己不會成功,但是堅持到了最后成功了,淚奔三尺,亦苦亦甜!
復制生成的打包文件,補充下載了一個libssp-0.dll后播放命令行 vlc video.mp4 成功播放,也有聲音。
一定要gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64-tools 這幾個工具都是5.x版本的,不能是6.0,否則會出現relocation _ITM_memcpyRnWt——————錯誤
FAAD錯誤可以警用
#########后記綜合########################
1、用同樣的環境和方法,編譯3.08版本出現如下問題,暫時未找到問題根源,估計又是環境的問題
touch .dxgitype
mkdir -p dxgi12
cp ../tarballs/dxgi1_2.idl dxgi12 && cd dxgi12 && patch -fp1 < ../../src/d3d11/dxgi12.patch
patching file dxgi1_2.idl
mkdir -p -- "/home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/x86_64-w64-mingw32/include/"
x86_64-w64-mingw32-widl -DBOOL=WINBOOL -I/home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/x86_64-w64-mingw32/include -I/usr/include/wine/windows/ -I/usr/include/wine/wine/windows/ -h -o /home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/x86_64-w64-mingw32/include/dxgi1_2.h dxgi12/dxgi1_2.idl
/usr/include/wine/windows/winnt.h:2114:1: Error: #error directive: 'You need to define a CONTEXT for your CPU'
../src/d3d11/rules.mak:83: recipe for target '/home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/x86_64-w64-mingw32/include/dxgi1_2.h' failed
make: *** [/home/js/vlcca/vlcgithubandroid/vlcwin64/vlc30/vlc/contrib/x86_64-w64-mingw32/include/dxgi1_2.h] Error 1
這個是少了d開頭的幾個頭文件,見office文檔說明(https://docs.microsoft.com/zh-cn/windows/win32/api/_direct3ddxgi/index)
patching file fxc2.cpp
Hunk #1 succeeded at 217 (offset 1 line).
Hunk #2 succeeded at 236 (offset 1 line).
Hunk #3 succeeded at 311 (offset 1 line).
Hunk #4 succeeded at 320 (offset 1 line).
mv fxc2-git-63ad74b7faa7033f2c1be9cc1cd0225241a1a9a5 fxc2 && touch fxc2
cd fxc2 && x86_64-w64-mingw32-g++ -static fxc2.cpp -o fxc2.exe
fxc2.cpp: In function ‘int main(int, const char**)’:
fxc2.cpp:295:28: error: ‘nullptr’ was not declared in this scope
LPSTR messageBuffer = nullptr;
^
../src/fxc2/rules.mak:43: recipe for target '.fxc2' failed
make: *** [.fxc2] Error 1
找到這個文件,然后把nullptr替換成NULL
4.0dev和3.08都試過使用同樣的環境進行編譯,但是失敗,而4.0好像需要gcc8,3.08也出現很多錯誤
編譯腳本內容(sh文件):
#! /bin/sh
set -e
# vlc win32 complie shell by yangxun
#andy add
export BUILDCC=/usr/bin/gcc
#export CFLAGS="-fPIC"
#export CXXFLAGS="-fPIC"
#export CFLAGS="-I/usr/include"
#export CXXFLAGS="-I/usr/include"
# function define
diagnostic()
{
echo "$@" 1>&2;
}
checkfail()
{
if [ ! $? -eq 0 ]; then
diagnostic "$1"
exit 1
fi
}
# arg get
while [ $# -gt 0 ]; do
case $1 in
--help|-h)
echo "Use -a to set Host triplet"
echo " i686-w64-mingw32 for Windows 32-bits"
echo " x86_64-w64-mingw32 for Windows 64-bits"
exit 0
;;
-a)
HOST_TRIPLET=$2
shift
;;
esac
shift
done
# set default host triplet
if [ -z ${HOST_TRIPLET} ]; then
#diagnostic "*** No HOST_TRIPLET defined,using i686-w64-mingw32"
diagnostic "*** No HOST_TRIPLET defined,using -a to set it"
exit 1
#HOST_TRIPLET="i686-w64-mingw32"
else
diagnostic "*** HOST_TRIPLET=${HOST_TRIPLET}"
fi
# detect build folder
if [ ${HOST_TRIPLET} = "i686-w64-mingw32" ]; then
MY_BUILD_FOLDER="win32"
fi
if [ ${HOST_TRIPLET} = "x86_64-w64-mingw32" ]; then
MY_BUILD_FOLDER="win64"
fi
# built
CONTRIB_CONFIG="
--disable-gcrypt
--disable-ssh2
--disable-vncclient
--disable-projectM
--disable-bluray
--disable-qt
--disable-qtsvg
--disable-sdl
--disable-SDL_image
--disable-glew"
#CONTRIB_CONFIG=""
mkdir -p contrib/${MY_BUILD_FOLDER}
cd contrib/${MY_BUILD_FOLDER}
echo "----------------bootstrap022222222222222222222--------------------------"
../bootstrap --host=${HOST_TRIPLET} ${CONTRIB_CONFIG}
echo "----------------fetch--------------------------"
make fetch
checkfail "contrib fetch failed"
#echo "----------------make clean################################--------------------------"
#make clean
echo "----------------make--------------------------"
make
checkfail "contrib make failed"
rm -f ../i686-w64-mingw32/bin/moc ../i686-w64-mingw32/bin/uic ../i686-w64-mingw32/bin/rcc
if [ ${HOST_TRIPLET} != "i686-w64-mingw32" ]; then
ln -sf ${HOST_TRIPLET} ../i686-w64-mingw32
fi
echo "----------------go back--------------------------"
# go back vlc root dir
cd -
# compile vlc
OPTIONS="
--disable-faad
--enable-flac
--enable-theora
--enable-twolame
--enable-avcodec
--enable-merge-ffmpeg
--enable-dca
--enable-mpc
--enable-libass
--enable-x264
--enable-schroedinger
--enable-realrtsp
--enable-live555
--enable-shout
--enable-caca
--enable-sse
--enable-mmx
--enable-zvbi
--disable-telx
--enable-nls
--disable-update-check
--disable-libcrypt
--disable-lua
--disable-goom
--disable-projectm
--disable-vsxu
--disable-vnc
--disable-vcd
--disable-libcddb
--disable-freerdp
--disable-opencv
--disable-dc1394
--disable-dv1394
--disable-dvdread
--disable-dvdnav
--disable-bluray
--disable-sdl-image
--disable-skins2
--disable-qt
--disable-a52"
#OPTIONS=""
#OPTIONS="
# --disable-qt"
echo "----------------bootstrap23333333333333--------------------------"
./bootstrap
mkdir -p ${MY_BUILD_FOLDER} && cd ${MY_BUILD_FOLDER}
export PKG_CONFIG_LIBDIR=$HOME/vlc/contrib/${HOST_TRIPLET}/lib/pkgconfig
echo "----------------configure2--------------------------"
CFLAGS=-fPIC
../configure --host=${HOST_TRIPLET} --build=x86_64-pc-linux-gnu ${OPTIONS}
echo "----------------make2--------------------------"
make
checkfail "vlc make failed"
make package-win32-zip
checkfail "vlc make package failed"