Windows下從原始碼編譯CEF

PPAPI提供了C和C 兩種外掛開發介面。要使用C 版本的介面,需要ppapi_cpp.lib和ppapi_cpp_objects.lib這兩個靜態庫,然而CEF的SDK裡沒有這兩個庫,只能編譯CEF的原始碼來得到。所以,我就編譯了CEF的原始碼。

花了幾天時間,反覆編譯幾次,過程比較艱辛,記錄一下。如果你參考我的過程編譯,請看完這篇文章再動手。

foruok原創,如需轉載請關注foruok的微信訂閱號“程式視界”聯絡foruok。

https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding這裡描述了怎麼從原始碼編譯CEF,這是主要的參考資料。

CEF支援自動、手動兩種編譯方法,我們使用基於git的自動構建流程。

注意,必須在無牆狀態下來編譯。

編譯步驟

Windows系統必須是Windows 7 x64 或更高版本,x86的不支援哦。

保證已經安裝了python,並設定了環境變數。

e:/sources/CEF是我的編譯目錄,以後都以此為例來說明。

安裝過程參考了http://www.chromium.org/developers/how-tos/build-instructions-windowshttps://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding,我試驗了幾次,出了一些錯。現在,按我下面的步驟來即可:

  1. 設定系統locale為English,否則可能遇到類似下圖的錯誤:
    error_unicode
  2. 安裝VS 2013 Update 4,其他版本的VS都歇菜。安裝過程中確保選擇MFC元件(Microsoft Foundation Classes for C )
  3. Windows 10 SDK,安裝到預設路徑下。
  4. 配置環境變數,使用Ninja編譯、使用VS 2013除錯,按下面的命令設定環境變數(在cmd.exe內):
    set DEPOT_TOOLS_WIN_TOOLCHAIN=0
    set GYP_GENERATORS=ninja,msvs-ninja
    set GYP_MSVS_VERSION=2013
  5. 下載automate-git.py指令碼檔案。
  6. 自動構建版本為2526的分支,用下面的命令:
    python e:/sources/CEF/automate-git.py –download-dir=e:/sources/CEF/2526 –branch=2526

提一下,automate-git.py會自動下載depot_tools、Chromium和CEF原始碼、構建CEF的除錯和釋出版本、建立SDK包。SDK包在e:/sources/CEF/2526/chromium/src/cef/binary_distrib目錄下。

特別說明

  • 如果你因為系統locale出錯,再次執行automate-git.py時,可能會遇見下面的錯誤(紅線所示):

error_out_exsit

此時刪除e:/sources/CEF/2526/chromium/src/out目錄,再來一遍即可。

  • VS 2013如果沒有安裝到預設目錄,也會出錯(我就是醬紫的):
    error_vcvars

我編譯了一天多,出了上面的錯誤。

沿著上圖出錯資訊回溯,發現已經執行到automate-git.py的975行,這是最後一步了,所有中間編譯已完成,就剩打包生成發行包了。

錯誤原因如圖上標註的,找不到vcvars32.bat。跟到msvs_env.bat檔案裡去看,發現其中通過硬編碼的VS路徑來引用vcvars32.bat,對於VS2013,它用”%PROGRAMFILES(X86)%\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat”,我安裝到別的地方去了……還好,有一個CEF_VCVARS變數,設定一下就好了。使用下列命令:

set CEF_VCVARS=E:\software\VS2013_64_update4\VC\bin\vcvars32.bat

然後我需要研究如何只生成SDK,執行“python e:/sources/CEF/automate-git.py –help”,檢視幫助,發現有一個–no-build選項還有一個–force-distrib選項,還有很多,最後用下面的命令生成了SDK發行包:

python e:/sources/CEF/automate-git.py --download-dir=e:/sources/CEF/2526 --branch=2526 --no-build --no-update --force-distrib

編譯成功後,生成的CEF SDK發行包在chromium\src\cef\binary_distrib目錄下,我這裡是cef_binary_3.2526.1364.gf6bf57b_windows32.zip。 注意,這裡面沒有PPAPI C 介面對應的靜態庫……但它們確實生成了,ppapi_cpp.lib和ppapi_cpp_objects.lib,在chromium\src\out\Release\obj\ppapi目錄下,拷貝到你的SDK裡就可以用了。

opengl庫libGLESv2.dll和libEGL.dll也在編譯過程生成了,DLL和對應的lib檔案都在chromium\src\out\Release下,也可以拷貝到SDK目錄下,PPAPI的有些示例會用到。

chromium\src\out\Release目錄下還有cefclient.exe,就是CEF SDK裡那個示例,可以執行。執行後效果如下圖:

cefclient

一點總結

編譯是個漫長的過程,可能遇到各種錯誤,基本找不到中文資料,Google猛搜吧……

閒言碎語:

  1. automate-git.py預設會構建debug和release兩個版本,很耗時,得十幾個小時。其實可以執行python e:/sources/CEF/automate-git.py –help檢視幫助,–no-debug-build選項可以不編譯Debug版本,–no-release-build可以不編譯Release版本,只編譯一個版本,會快很多。
  2. 編譯過程中出錯,再次編譯時,可以指定 –no-update選項,跳過原始碼更新
  3. CEF編譯時連結的執行庫為MT(多執行緒)。如果你要編譯CEF或PPAPI示例,也要在“配置屬性–>C/C –>程式碼生成–>執行庫”中設定為MT。
  4. CEF編譯時定義了UNICODE和_UNICODE巨集。編譯示例時最好也使用 Unicode 字符集。

相關文章參考: