转载请说明原出处,谢谢~~: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
,使用MD
、MTd
等选项都报运行时不匹配的错误。即使项目是Debug模式,运行时库也要选择MT
。而且c++预处理宏中不能包含_DEBUG
,否则也会报运行时库不匹配。