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

简介: 转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/77480333之前写过一篇文章,关于编译Cef2623源码的( 在Windows下编译Cef3.2623并加入mp3、mp4支持(附带源码包和最终DLL)),已经编译出了libcef.dll。

转载请说明原出处,谢谢~~: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

目录
相关文章
|
存储 Cloud Native Linux
QtCreator中三种不同编译版本 debug、release、profile 的区别
QtCreator中三种不同编译版本 debug、release、profile 的区别
|
iOS开发
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
Xcode报错解决方法:ld: symbol(s) not found for architecture arm64
3251 0
|
Linux C语言 计算机视觉
OpenIN2 Linux 编译OpenCV 报错undefined reference to `xxx@xxx‘
OpenIN2 Linux 编译OpenCV 报错undefined reference to `xxx@xxx‘
323 0
OpenIN2 Linux 编译OpenCV 报错undefined reference to `xxx@xxx‘
|
存储 编译器 C语言
STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)
无论是是何种MCU,从简单的51,MSP430,到ARM9,ARM11,A7 都必须有启动文件,对于MCU来说,他是如何找到并执行main函数的,就需要用到“启动文件”,本文就来说说 STM32 的启动过程。
1157 1
STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)
|
Linux
linux运行protoc出现错误 while loading shared libraries: libprotoc.so.19
linux运行protoc出现错误 while loading shared libraries: libprotoc.so.19
136 0
|
开发工具 Android开发 C++
【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( Application.mk | APP_ABI := armeabi-v7a arm64-v8a x86 x86_64 )
542 0
|
iOS开发
MAC编译OpenJDK8:ld: library not found for -lstdc++(独家解决办法)
MAC编译OpenJDK8:ld: library not found for -lstdc++(独家解决办法)
186 0
|
XML Linux 开发工具
LINUX编译ARM64/AARCH64版本的jogamp(gluegen/jogl)注意事项
LINUX编译ARM64/AARCH64版本的jogamp(gluegen/jogl)注意事项
194 0
编译OpenJDK12:LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
编译OpenJDK12:LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
240 0
|
计算机视觉
OpenCV编译时提示错误“ Built target libprotobuf”
OpenCV编译时提示错误“ Built target libprotobuf”
644 0