如何編譯出cef2623中的cef_sandbox.lib靜態庫

轉載請說明原出處,謝謝~~:http://blog.csdn.net/zhuhongshu/article/details/77480333

之前寫過一篇文章,關於編譯Cef2623源碼的( 在Windows下編譯Cef3.2623並加入mp3、mp4支持(附帶源碼包和最終DLL)),已經編譯出了libcef.dll。

起因

今天碰到個需求,需要在項目中讓Cef支持flash播放,關於支持flash的方法見(Cef功能開發經驗總結)。爲了使用flash,就要使用sandbox功能,否則Cef使用過程中會有瞬間出現一個cmd彈框(這是個bug),關於這個bug的解決辦法,詳見:解決cef加載flash時彈出黑框的問題。而cef_sandbox.lib是個靜態庫,cef2623自帶的cef_sandbox.lib是用VS2013編譯的,而我用的是VS2015,所以沒變直接鏈接cef_sandbox.lib,於是我很自然的想到去自己用VS2015編譯一遍cef的源碼。

然而編譯完cef後發現,所有的相關dll和文件都編譯出來了,唯獨沒有cef_sandbox.lib靜態庫!去網上查了查資料,只有一個網友遇到和我相同的問題(http://magpcss.org/ceforum/viewtopic.php?f=6&t=14202),但是沒有解決辦法。在\chromium\src\out\Release\obj\sandbox\sandbox.lib目錄和\chromium\src\out\Release\obj\cef\cef_sandbox.lib目錄中可以看到名字與sandbox相關的靜態庫。但是我們真正需要的靜態庫是200多M的文件,而這兩個只有幾百K,不是我需要的,所以看情況貌似cef源碼編譯過程中不會自動產生cef_sandbox.lib,需要自己想辦法。

解決過程

於是乎我翻了翻源碼中一些gyp、py等配置文件,終於在\chromium\src\cef\tools\make_distrib.py裏翻到了相關信息!
這裏寫圖片描述
可以看到這個python源碼裏,給sandbox_libs列表賦值了幾個靜態庫,而且包含了前面說的那兩個靜態庫文件。我覺得這幾個靜態庫合起來就是真正的cef_sandbox.lib,於是直接找到這幾個文件,放到項目裏去編譯,結果發現能用!搞到這裏最起碼已經解決了沒有cef_sandbox.lib的問題了。

接下來順藤摸瓜,找到了這裏
這裏寫圖片描述
調用了一個combine_libs的函數,看函數名字意思就是把多個lib文件合併起來的意思,也就是把sandbox_libs列表裏指向的幾個靜態庫合併爲一個cef_sandbox.lib文件,最終根據combine_libs函數找到了combine_libs.py模塊,發現他是用VC裏面自帶的lib.exe的功能,可以把多個靜態庫合併爲一個得到了最終需要的cef_sandbox.lib。所以我直接使用lib.exe自己手動合併出了一個cef_sandbox.lib。至此就算是搞完了。

後記

查看相關源碼,按理說cef編譯完後,應該會自動合併得到cef_sandbox.lib,但是我的卻沒有,後來發現是因爲VS的安裝路徑不是默認的C:\Program Files (x86)。cef編譯完成後,打包時\chromium\src\cef\tools\make_distrib.py腳本的combine_libs函數調用同目錄的msvs_env.bat批處理去查找VC的vcvars32.bat。而msvs_env.bat批處理通過硬編碼的C:\Program Files (x86)VS路徑來引用vcvars32.bat。可以直接修改msvs_env.bat讓其指向自己的VS路徑就可以了!

cef_sandbox的一個坑

在項目中使用cef_sandbox.lib,但是發現只要開啓沙盒,所有子進程(渲染進程、flash進程)都無法啓用,只有關閉了沙盒才能啓動。找到半天不清楚原因。後來在cef_sandbox_win.h裏看到說明:
這裏寫圖片描述
沙盒相關功能不能在dll中使用,而是直接在exe中調用。而我項目爲了模塊發,恰好用了dll單獨封裝了cef。經過修改後在exe中使用,的確正常了!

另外在鏈接cef_sandbox.lib是發現,運行時庫必須選擇MT,使用MDMTd等選項都報運行時不匹配的錯誤。即使項目是Debug模式,運行時庫也要選擇MT。而且c++預處理宏中不能包含_DEBUG,否則也會報運行時庫不匹配。

Redrain QQ:491646717 2017.8.22

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章