之前編譯過cef-chromium的源碼,但是找不到之前的源碼工程了。幸好壓縮源碼還存在電腦裏。
現在又要編譯一下,因爲需要定製自己需要的功能,這裏就把編譯過程記錄一下,以免以後還會遇到,也分享給需要的讀者。
下載cef-chromium的源碼需要到google網站去,但這個網站被國家封了,所幸我通過其它渠道下載了全部源碼。
打包的源碼在這裏下載:
鏈接:http://pan.baidu.com/s/1pLqAeD1 密碼:0b62
我將源碼解壓到了E盤cef-chromium目錄下,路徑爲:E:\cef-chromium
裏面有cef、chromium、depot_tools3個目錄。
我的機器是Win7 64位的系統,安裝了VS2013和DirectX SDK。
打開VS2013命令行工具,進入路徑E:\cef-chromium\chromium\src\cef,然後輸入cef_create_projects.bat按回車,
提示python.bat不是內部或外部命令。
這裏是編譯依賴工具環境沒有配上,在控制檯界面輸入:
set PATH=E:\cef-chromium\depot_tools;%PATH%
然後再次輸入cef_create_projects.bat,就可以生成VS2013的工程了。
但是我不會用VS2013打開進行編譯,爲什麼?因爲打開VS2013進行編譯,VS2013也是調用ninja進行編譯,無法觀察到具體的編譯細節和進度,就算編譯
出現錯誤了也不會停止,所以最好在命令行下通過ninja進行編譯。
切換到VS2013命令行,然後進入目錄:
cd E:\cef-chromium\chromium\src\out\Release
然後輸入:
ninja
接着就開始編譯了。
編譯過了一會出現了一個錯誤:
error:C2220 警告被視爲錯誤。這個是警告等級在搗鬼,需要把工程裏的編譯警告等級降低!
工程文件很多,需要批量替換,替換工具沒有限制,我用QtCreator進行批量替換。
需要把E:\cef-chromium\chromium\src目錄下的所有.ninja文件裏的/WX換成/W3,這樣警告纔不會被當做錯誤處理。
直接替換了去。然後控制檯下輸入ninja,繼續編譯。
接來下又會出現編譯錯誤停止,這就是第二個坑了:
[6/9584] ACTION Copying D3D Compiler DLL...
FAILED: E:\cef-chromium\depot_tools\python276_bin\python.exe gyp-win-tool action-wrapper environment
.x86 copy_compiler_dll_target_copy_dll_d5e7737f8056aa69e632ead4d36d2ac1..rsp ..\..\third_party\angle
\src
ACTION Copying D3D Compiler DLL
說明這是個拷貝動作出現錯誤,進入目錄:
cd E:\cef-chromium\chromium\src\third_party\angle\src
發現有個copy_compiler_dll.bat,編輯打開此文件,發現有一個拷貝d3dcompiler_46.dll的命令,
直接把這個命令刪除即可,於是copy_compiler_dll.bat的內容變成了這樣:
@echo off
set _arch=%1
set _arch=%_arch:Win32=x86%
改然後切換到命令行,輸入ninja,繼續編譯。
接下來就是漫長的編譯過程,根據CPU性能來決定編譯時間,通常需要2~6小時。
到最後快編譯完成時,又出現了一個錯誤,編譯停止了,這是最後一個坑:
e:\cef-chromium\chromium\src\cef\libcef\browser\chrome_scheme_handler.cc(262) : error C2065: “None
”: 未聲明的標識符
出問題的是這一句:
parser.Add("CEF",base::StringPrintf("%d.%d.%d",CEF_VERSION_MAJOR,CHROME_VERSION_BUILD,CEF_REVISION));
這其實是
CEF_REVISION被定義成了None造成的
打開E:\cef-chromium\chromium\src\cef\include\cef_version.h
可看到
#define CEF_REVISION None
而這個None卻未被定義。
因此,直接改成
#define CEF_REVISION 1930然後保存。切換到控制檯,輸入ninja繼續編譯。
最後的鏈接需要花不少時間,最終還是編譯成功了。
有圖爲證,看一下編譯結果吧:
VS2013命令行需要設置的變量:
set DXSDK_DIR=C:\Program Files (x86)\Microsoft DirectX SDK (August 2006)
set GYP_GENERATORS=ninja,msvs-ninja
set GYP_MSVS_VERSION=2013
set PATH=K:\cef-chromium\depot_tools;D:\vc2013\bin;D:\vc2013\sdk\Perl516\bin;D:\vc2013\PlatformSDK_8.1\bin\x86;D:\vc2013\sdk\Python278;D:\vc2013\sdk\Python278\DLLs;D:\vc2013\sdk\gles\bin;D:\vc2013\sdk\icu\bin;D:\vc2013\sdk\ruby\bin;D:\vc2013\sdk\tbb\bin;D:\vc2013\sdk\WMDM\lib;D:\vc2013\sdk\git\bin;D:\DirectXSDK2010\Utilities\bin\x86;D:\vc2013\sdk\cmake\bin;D:\vc2013\sdk\gyp;D:\cef_binary_3.2272.2077_windows32\Release;D:\vc2013\sdk\duilib\bin;D:\vc2013\sdk\irrlicht\bin;D:\vc2013\sdk\cef-normal;%PATH%
set INCLUDE=D:\vc2013\sdk\angle\include;D:\vc2013\include;D:\vc2013\PlatformSDK_8.1\Include\um;D:\vc2013\include;D:\vc2013\PlatformSDK_8.1\Include\shared;D:\vc2013\sdk\openvg\include;D:\vc2013\sdk\opengl\include;D:\vc2013\sdk\ruby\include;D:\vc2013\sdk\Python278\include;D:\vc2013\sdk\mysql\include;D:\vc2013\sdk\icu\include;D:\vc2013\sdk\atlmfc\include;D:\vc2013\sdk\WMDM\inc;D:\vc2013\sdk\tbb\include;D:\DirectXSDK2010\Include;D:\vc2013\PlatformSDK_8.1\Include\winrt;D:\cef_binary_3.2272.2077_windows32\include;D:\cef_binary_3.2272.2077_windows32;D:\vc2013\sdk\duilib\include;D:\vc2013\sdk\irrlicht\include;D:\vc2013\sdk\cef-normal\inc
set LIB=D:\vc2013\lib;D:\vc2013\sdk\dx11\lib;D:\vc2013\PlatformSDK_8.1\Lib\winv6.3\um\x86;D:\vc2013\sdk\gnuwin32\lib;D:\vc2013\sdk\opengl\lib;D:\vc2013\sdk\tbb\lib\ia32\vc10;D:\vc2013\sdk\ruby\lib;D:\vc2013\atl\lib;D:\vc2013\sdk\Python278\libs;D:\vc2013\sdk\gles\lib;D:\vc2013\sdk\mysql\lib;D:\vc2013\sdk\icu\lib;D:\vc2013\sdk\angle\lib;D:\vc2013\sdk\atlmfc\lib;D:\vc2013\sdk\WMDM\lib;D:\vc2013\sdk\tbb\lib;D:\vc2013\sdk\WMDM\lib;D:\vc2013\sdk\git\lib;D:\DirectXSDK2010\Lib\x86;D:\cef_binary_3.2272.2077_windows32\Release;D:\vc2013\sdk\duilib\Lib;D:\vc2013\sdk\irrlicht\lib;D:\vc2013\sdk\cef-normal\lib