Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 962|回复: 0
打印 上一主题 下一主题

如何编译出cef2623中的cef_sandbox.lib静态库

[复制链接]

1272

主题

2067

帖子

7962

积分

认证用户组

Rank: 5Rank: 5

积分
7962
跳转到指定楼层
楼主
发表于 2023-12-26 17:53:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转载请说明原出处,谢谢~~: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,否则也会报运行时库不匹配。

Redrain QQ:491646717 2017.8.22
————————————————
版权声明:本文为CSDN博主「Redrain」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuhongshu/article/details/77480333

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-25 09:38 , Processed in 0.061616 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表