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](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-windows](http://www.chromium.org/developers/how-tos/build-instructions-windows)和[https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding](https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding),我試驗了幾次,出了一些錯。現在,按我下面的步驟來即可:
1. 設置系統locale為English,否則可能遇到類似下圖的錯誤:

1. 安裝VS 2013 Update 4,其他版本的VS都歇菜。安裝過程中確保選擇MFC組件(Microsoft Foundation Classes for C++)
1. Windows 10 SDK,安裝到默認路徑下。
1. 配置環境變量,使用Ninja編譯、使用VS 2013調試,按下面的命令設置環境變量(在cmd.exe內):
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_GENERATORS=ninja,msvs-ninja
set GYP_MSVS_VERSION=2013
1. 下載[automate-git.py](https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py)腳本文件。
1. 自動構建版本為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時,可能會遇見下面的錯誤(紅線所示):

此時刪除e:/sources/CEF/2526/chromium/src/out目錄,再來一遍即可。
- VS 2013如果沒有安裝到默認目錄,也會出錯(我就是醬紫的):

我編譯了一天多,出了上面的錯誤。
沿著上圖出錯信息回溯,發現已經執行到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里那個示例,可以運行。運行后效果如下圖:

# 一點總結
編譯是個漫長的過程,可能遇到各種錯誤,基本找不到中文資料,Google猛搜吧……
閑言碎語:
1. automate-git.py默認會構建debug和release兩個版本,很耗時,得十幾個小時。其實可以執行python e:/sources/CEF/automate-git.py –help查看幫助,–no-debug-build選項可以不編譯Debug版本,–no-release-build可以不編譯Release版本,只編譯一個版本,會快很多。
1. 編譯過程中出錯,再次編譯時,可以指定 –no-update選項,跳過源碼更新
1. CEF編譯時鏈接的運行庫為MT(多線程)。如果你要編譯CEF或PPAPI示例,也要在“配置屬性–>C/C++–>代碼生成–>運行庫”中設置為MT。
1. CEF編譯時定義了UNICODE和_UNICODE宏。編譯示例時最好也使用 Unicode 字符集。
相關文章參考:
- [**CEF Windows開發環境搭建**](http://blog.csdn.net/foruok/article/details/50468642)
- [**CEF加載PPAPI插件**](http://blog.csdn.net/foruok/article/details/50485448)
- [**VS2013編譯最簡單的PPAPI插件**](http://blog.csdn.net/foruok/article/details/50485461)
- [**理解PPAPI的設計**](http://blog.csdn.net/foruok/article/details/50486788)
- [**PPAPI插件與瀏覽器的交互過程**](http://blog.csdn.net/foruok/article/details/50494061)
- 前言
- CEF Windows開發環境搭建
- CEF加載PPAPI插件
- VS2013編譯最簡單的PPAPI插件
- 理解PPAPI的設計
- PPAPI插件與瀏覽器的交互過程
- Windows下從源碼編譯CEF
- 編譯PPAPI的media_stream_video示例
- PPAPI插件的繪圖與輸入事件處理
- 在PPAPI插件中創建本地窗口
- PPAPI插件與瀏覽器的通信
- Windows下從源碼編譯Skia
- 在PPAPI插件中使用Skia繪圖
- 加載DLL中的圖片資源生成Skia中的SkBitmap對象
- PPAPI+Skia實現的涂鴉板
- PPAPI中使用Chromium的3D圖形接口
- PPAPI中使用OpenGL ES繪圖