1. 程式人生 > >Chromium原始碼獲取與編譯--附加一個簡單例子的編譯

Chromium原始碼獲取與編譯--附加一個簡單例子的編譯

從工作到現在,一直弄介面相關的東西,弄了好多年,包括前公司也買了一套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 放在這裡備份一下吧。省得以後要弄最新版編譯又到處找資料。

相關推薦

Chromium原始碼獲取編譯--附加一個簡單例子編譯

從工作到現在,一直弄介面相關的東西,弄了好多年,包括前公司也買了一套UI,但是用下來以後發現不是這個問題就是那個問題。現在新的公司還在用MFC。MFC其實沒什麼不好,就是不能改原始碼這點比較糾結。。(誰說不能改原始碼的,改完自己編譯就是了。。orz。。你倒是給我個工程檔案?

chromium原始碼下載編譯

最近要做一個Android上的Hybrid專案,本來一直用WebKit,但是WebKit是在2012年移植到Android上的,已經不能支援最新的Web技術了,而且Android上的Chromium發展迅速,已經能夠滿足各種需求了。 實際上現在才開始跟進Chromium,已

菜鳥 cef 的邂逅之旅(一):cef 原始碼獲取編譯

一、引言 最近工作中涉及到了有關嵌入瀏覽器控制元件的任務,並且要求支援 H5。之前使用了 wke,但是發現其對於 H5 的支援不夠好,因此只能選擇“聞名已久”的 cef。 cef 是什麼呢: CEF 全稱 Chromium Embedded Fram

Android O Chromium 原始碼下載編譯

去年Android O 釋出之後,按照慣例,我需要做一些移植工作,把之前版本加的針對我們公司平臺的Pacth合過來,從Android M開始,Chromium source code就需要單獨下載和編譯,不再包含在Android source code裡面。一般下載完Andr

用mpvuenode實現一個簡單的爬蟲

序言 爬蟲技術,在當今的互聯網裡面是佔據著非常重要的位置的。那什麼是爬蟲呢?亦即是按照一種特定的指令碼,請求指定的網頁並獲取資料的一段程式。而我們今天這個分享呢,就是利用node的幾個模組,配合mpvue實現小程式的爬蟲功能。 需求分析 1. 爬蟲目標 利用掃碼

Centos編譯執行一個簡單的C++程式

I、準備工作: 1) 一個類UNIX系統,這裡選擇CentOS 7 2) 安裝gcc編譯器,方法很多,一種簡單的安裝方式:yum install gcc-c++   注:yum install g++ 會失敗,因為沒有g++這個包 安裝好後顯示如下: 3)建立測試

npm install —— 從一個簡單例子,看本地安裝全域性安裝的區別

npm的包安裝分為本地安裝(local)、全域性安裝(global)兩種,從敲的命令列來看,差別只是有沒有-g而已,比如 npm install grunt # 本地安裝 npm install -g grunt-cli # 全域性安裝 這兩種安裝方式有什麼區別呢?從

安卓逆向入門之如何連線夜神AndroidKiller,以及一個簡單crackme

準備工作 為了確保夜神與其他相關的能夠連線上,在用Android killer的時候,就將Android killer中的adb+2個dll拷貝至夜神中,用到Android studio的時候,就將sdk中的platform中的這個adb+2個dll

spring4Thymeleaf整合一個簡單示例

1、spring使用的版本是spring4.0.0:從spring4.0.0裡解壓出來的libs檔案裡的所有jar包。 2、thymeleaf版本是thymeleaf-3.0.9.RELEASE:從thymeleaf-3.0.9.RELEASE解壓出來後,在lib資料夾裡

一個簡單編譯原理詞法語法語義分析程式

這是我們學校的課程實驗,想做個學習記錄,所以發表了這篇部落格,有不足的地方,歡迎大家共同探討,也歡迎大家轉載,轉載時請務必註明作者,希望對想學習編譯原理的同學有一定的幫助。 一 語法結構的詞法說明 關鍵字:begin if while 和檔案結束符E

Flutter原始碼剖析(一):原始碼獲取構建

## 概述 本文介紹了Flutter原始碼的獲取與構建,後面會另有文章介紹Flutter原始碼的版本管理、開發環境搭建等主題。 ## 準備工作 Flutter原始碼分為兩個部分: * [flutter/flutter](https://github.com/flutter/flutter)是框架層,為

用socket.io實現websocket的一個簡單例子

soc .html www sock 在線 ket log html 簡單例子 http://biyeah.iteye.com/blog/1295196 socket.io的介紹 http://www.cnblogs.com/mazg/p/5467960.html

C語言多線程的一個簡單例子

color oid blog stdlib.h null bsp 等待 creat 多線程   多線程的一個簡單例子:    #include <stdio.h> #include <stdlib.h> #include <string.h&

Python網絡編程UDP服務器客服端簡單例子

... ket add and cti while NPU inpu dto [轉載] https://blog.csdn.net/hu330459076/article/details/7868028 UDP服務器代碼: #!/usr/bin/env pyt

netsh interface portproxy的一個簡單例子

get 文檔 let pre interface 簡單例子 配置文件 exe CP netsh interface portproxy的微軟幫助文檔地址: https://technet.microsoft.com/zh-cn/library/cc776297(WS.10

使用java實現快速排序的一個簡單例子

fast val rgs 快速 實現 個數 static void sta public static void main(String[] args) { // 測試排序 Random r = new Random(); int arr[] = new

ListSet的區別簡單例子

import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class SetDemo { public static void demo

一個簡單例子解釋工廠模式建立物件

function createObject(name,age) { var obj=new Object(); obj.name=name; obj.age=age; obj.eat=function () { console.log(

Java產生死鎖的一個簡單例子

什麼是死鎖?所謂死鎖,是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。 因此我們舉個例子來描述,如果此時有一個執行緒A,按照先鎖a再獲得鎖b的的順序獲得鎖,而在此同時又有另外一個執行緒B,按照先鎖b再鎖a的順序獲得鎖。如下圖所示: &nbs

Spring學習筆記(一):眼見為實,先上一個簡單例子

概述 所謂眼見為實,Spring雖然是一個輕量級的框架,但涉及眾多的概念,理解起來並不容易,因此,先參考資料寫一個簡單的Demo,從中洞見Spring的大體工作流程,為後面深入學習做鋪墊。 本文的Demo很簡單:模擬圖書資料訪問服務,即向資料庫中新增圖書資訊,涉及IBoo