从工作到现在,一直弄界面相关的东西,弄了好多年,包括前公司也买了一套UI,但是用下来以后发现不是这个问题就是那个问题。现在新的公司还在用MFC。MFC其实没什么不好,就是不能改源码这点比较纠结。。(谁说不能改源码的,改完自己编译就是了。。orz。。你倒是给我个工程文件?)。
然后对比了很多市面上的GUI库,最中意的就是wxWidgets,但是他是个人维护的。。所以稳定性。。版本更新也就比较慢了。另外c++做界面嘛,最终肯定是HTML5为主流的。。。毕竟c++并不擅长做界面,那为什么不交给专业的东西 做专业的事情?
基于自己修改的那一套UI库,我个人认为,一个UI库不光是能够写写画画而已,首先它必须要有一个资源管理类--资源打包与读取,IO管理模块,同步异步读文件的。再次它的控件库要比较完整,再然后它必须要有界面编辑器和资源打包工具。。当然界面编辑器都是浮云。。。毕竟程序员自己也就是UI设计师。。。ORZ。。很遗憾我工作那么多年一直没见到过给c++设计界面的美工。。。
前几天公司的高层又在争吵一些什么WPF的问题。。老板觉得界面太丑,一些人想要什么extjs 一些人抬出c#。。。其实我想说,c++是不想做界面,真要做起来,什么c#WPF 什么extjs都是浮云。最后看到chrome的源码和国内一些人写的文章,渲染线程与主线程分离的特性,刚刚好满足前几天老板说的 显示10万条数据的问题。OK 那就这个吧。google是个大公司。里面全是代码精英。代码看下来确实惊为天人。不光包含界面库,url解析,资源文件加载,打印和打印预览 一大堆辅助函数和功能类。投入这个的研究,那真是以后什么需求都不愁了。当然很多控件还没有的。比如时间控件。。但是它的可扩展性很强,所以控件不完整这个对我来说不是什么大问题。我只想说,这是继doom3之后我接触到的质量最高的源码。。。研究它绝对不会坑爹。以我个人这么多年来的代码阅读经历,我认为一个c++程序员,到目前为止,只需要看doom3 或者chrome源码就足够了。。
以上就是废话。再经过半个月的下载源码与编译的痛苦经历之后,整理出这篇最新的关于编译chromium的文章,希望给刚入门的,或者有志于研究chrome源码的同学带来一点帮助。对于过时的编译blog。我只想说。。。大量的转载真是害死人啊。。又废话了一堆。以下开始正事。记住一点:不要问为什么,只需要照着做就行了(如果你确实是想编译成功chrome而不是扯淡的话)。
0.5 如果你不是自虐狂的话,请安装VS2013。不然。。。呵呵。自己逛逛第二条说的网址。对于我来说,能够快速从源码吸取多少东西才是王道。其他一切都是浮云。如果有人确实觉得VS2013不能接受。。OK。自己找虐去。
1.源码绝对不要获取最新版。获取哪个版本?一般来说,看chrome浏览器的版本下载就行。具体操作。下载chrome浏览器,右上角点chrome帮助。看版本信息。然后记住版本号。
2.记得www.chromium.org这个网址。以后你会是它的常客。。。
3.下载depot_tools。-----(这些基本的东西去别的blog看或者去上面这个网址看比较好。)配置好depot_tools的环境变量
4.切换到你想要保存源码的目录,执行gclient config http://src.chromium.org/svn/releases/36.0.1929.1 当然号是你在第一步看到的为准。搞错别怪我坑爹。是你自己坑自己。那些什么last know good release都是浮云。想要研究源码,就不要太纠结最新版。当然还是给出一个网址,给你们去看https://src.chromium.org/viewvc/chrome/releases/
可以到这里查看版本的可编译状态lkgr =last known good release
http://build.chromium.org/p/chromium.lkgr/console
5.执行gclient sync.睡上一觉。如果发现没获取完 再输入如上东西。--force 选项你看着办呗。 什么git 下载失败的问题,自己搞个VPN去弄吧。。如果你觉得这个太纠结的话。其实下载git1.9.3什么的失败也没什么影响。
6.下载完了之后。。如何判断已下载完?---运行第五步的命令。你眼睛看看,自己判断啊。。相信各位不是小朋友了。智力都基本正常的。先不要着急按照别的blog给出的gclient runhooks 什么的。。不然坑死你爹别怪我。打开build目录下的common.gypi。搜索msvs_disabled_warnings 你会看到这里禁用的一大堆警告。当然会有好几个搜索结果,如果你不懂得我说什么,你看一下“这里禁用的一大堆警告”这句话就知道我说的是哪里了。不废话 加上4996, 4067, 4800, 4251 保存关闭。
7.cmd下切到源码目录。输入
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set GYP_MSVS_VERSION=2013
set GYP_DEFINES=component=shared_library
set GYP_GENERATORS=msvs
新版本已经默认使用USE_AURA=1了。。
在这里我就要吐槽一下所有国内的blog了。。。不知道是不是大家都是linux牛人。总之我没有在任何一个blog上面看到这句话set GYP_GENERATORS=msvs。后来才在第二条的网址的某个角落看到这句话。。啧啧。。。吐血。说什么gclient runhooks 产生sln的都是坑爹货。。。当然不排除以前确实可以。。。我在这里抓破不少头皮了。。
第七条运行完毕gclient runhooks之后就会有sln了。至于哪个sln是你想要的?当然是chrome.sln了。。。先不要着急打开sln啊。请看第八条。。。
8. 打开VS2013 禁用vissual assist。。。为什么要禁用?怎么禁用?第一个疑问不要问。自己去试。第二个问题我也不会告诉你,因为这个是你应该掌握的本事。
OK 开始编译。我的笔记本怒吼了2个多小时,编译完成。好了 可以研究源码了。以下是其他废话。。。不在编译教程之内。
9.抽取框架都是浮云。千万不要试着去搞什么抽取框架的事情。为什么,抽出来就意味着你失去了google最新版的支持。。老老实实在src目录下 新建一个helloworld项目,设定好输出目录和依赖include路径。。。怎么设置?。。。打开views.sln。根据那个excample 来
直接给出答案。。目录放的不对 坑爹别怪我。自己回家数星星。或者要求你的老板扣你的工资。说你的水平不太合格。
..\..\third_party\wtl\include;..\..\third_party\khronos;..\..\gpu;..\..\skia\config;..\..\third_party\WebKit\Source;..\..\;..\..\third_party\skia\include\core
库路径
..\..\build\Debug\lib
输出目录什么的就自己搞了。调试目录什么的你们都懂。。当然我确信很多人不懂。不过。。。正因为这样,所以我才不告诉你们。因为痛苦得来的东西才不会忘记。
10.新建HelloWorld并编译。。。emm。。。代码文件什么的 第二条里面有。。我就不贴了。。 这里重点要说的是头文件 以及预处理命令。
我发布这篇blog为止,最新的头文件是这样设定的。。(以后坑爹了也不要怪我)
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/strings/utf_string_conversions.h"
#include "ui/gfx/canvas.h"
#include "ui/views/controls/label.h"
#include "ui/views/view.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
然后下面就是你们自己写的类了。。这个类在哪?请看第二条的网页。。
cpp是这样写的
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "hellowndd.h"//这个是我自己的头文件。。不要问一些白痴的问题。。
#include <windows.h>
#pragma comment(lib,"base.lib")
#pragma comment(lib,"views.lib")
#pragma comment(lib,"gfx.lib")
#pragma comment(lib,"events.lib")
#pragma comment(lib,"ui.lib")
#pragma comment(lib,"base_i18n.lib")
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
CommandLine::Init(0, NULL);
base::AtExitManager at_exit;
ui::RegisterPathProvider();
CHECK(base::i18n::InitializeICU());
std::string app_locale = ResourceBundle::InitSharedInstanceWithLocale("en-US", NULL);
base::MessageLoop message_loop(base::MessageLoop::TYPE_UI);
views::Widget::CreateWindow(new WindowView)->Show();
base::RunLoop().Run();
return (int)0;
}
然后c++/预处理器 加上 USE_AURA=1;NOMINMAX。OK 编译吧。。。。
然后,真正坑爹的事情出来啦。。编译通过。运行出错。调试viewexcample_with_content发现其实因为Aura框架的原因。已经不能通过旧的blog那样子生成一个简单窗口了。所以生成一个简单窗口什么的。。好像已经成为过去式了。所以上面的代码其实是没有什么用处的(如果有人知道without content生成窗口的方法。。。请告诉我,不胜感激)
放在这里,其实只是作为自己的备份。。毕竟纠结了半个月啊。。四次下载代码 十几个日日夜夜。。。第一次下载完最新版 。OK 编译不通过。。至于期间不生成sln什么抓破头皮的事就不用说了。。真是艰难啊。第二次。。OK 花钱买VPN。把tarball下回来 在tarball基础上编译。。果断果断也没有编译过去。。OK又坑爹了。。18块钱。没了。这里再愤怒吐槽天草这是要做什么?连googleapis都上不去。你这是闹哪样?第三次。。哈哈 学乖了,看别人的blog都是一路编译成功的。看了看最后发布的日期 2013.8月 OK。悟了。本人不再下载最新版了。果断下载lkgr啊。。好吧 就是上面这个版本号。 OK 又被坑。。ax_enums.h经历一场大改动。需要自己git个补丁回来。大哥我是git新手,难道你要我再恶补一下git怎么用?或者手动修改?这两个对我都没什么帮助,所以我当然不会话费力气去学什么git命令。什么diff命令浮云。毕竟我只用svn。
hoho 最后一次终于学乖了,我就下chrome发布的版本号对应的源码。。终于编译成功。泪流满面。。。那时已是半夜2点40分。。。
更加坑爹的是,第二天上班,google发布了 34.0.1847.116 版。我是不会再下载这个版本的了。。
今天是周末,正好有时间研究这个chorme 放在这里备份一下吧。省得以后要弄最新版编译又到处找资料。