Chromium工程中連接Mysql與探索添加附加庫(lib,dll)的方法


近期在Windows修改編譯Chromium的過程中,需要連接Mysql數據庫,由於Chromium並沒有自身集成Mysql Connector,所以需要附加外部的庫進行再進行編譯。以下是近期摸索出的方法。

注1:在Chromium中不允許使用C++的try,catch,throw語法
注2:在使用第三方庫前,先新建項目測試

1. 連接Mysql的三次嘗試

1. 1 第一次嘗試–使用Mysql Connector C++

首先,結果是失敗的,所以此處省略而寫。
由於Mysql Connector C++需要依賴Boost模板庫的SmartPtr庫,故下載了Boost庫的源代碼。
首先,使用VS創建了一個新項目測試,由於VS的界面化操作,添加包含目錄與添加庫目錄都非常的方便,故使用VS連接數據庫是成功的。
但之後準備在Chromium中測試,將其放入Chromium/src/third_party中,作爲第三方庫,準備只依賴所需的頭文件(因爲SmartPtr無需編譯成lib也可以使用),但是由於Chromium編譯器的要求,對於頭文件的路徑問題,相對路徑只能使用雙引號(" "),並且SmartPtr中所包含的文件也都應使用相對路徑,所以修改起來十分麻煩,所以放棄了這種方法。

1.2 第二次嘗試–使用OTL+ODBC連接Mysql

很不幸,結果也失敗了
雖然OTL+ODBC連接數據庫在新建VS項目進行操作時,非常的簡易(由於OTL只有一個頭文件),同時安裝Mysql的ODBC驅動,在控制面板的ODBC數據源處進行配置即可在VS連接Mysql。
但問題在轉移到Chromium時出現了,由於Chromium不支持try catch throw語句,所以編譯無法通過。(應該是一個配置文件中有設置,但是並未找到在哪裏改),所以這種方法也放棄了

1.3 第三次嘗試–使用Mysql Connector C + MysqlQuery

Yeah!它成功了
MysqlQuery是我再GitHub上找到的一個Mysql Connector C的Wrapper,比較易於使用。MysqlQuery地址 ,他只有兩個頭文件,並且頭文件中只依賴了mysql.h文件(這個文件位於mysql的本地安裝目錄的include文件夾中),而且mysql.h中的頭文件依賴關係都使用的雙引號來引用,路徑並不需要修改,所以直接使用即可,爲方便使用,我在Chromium/src/third_party下創建了一個mysql-connector的文件夾將其作爲第三方庫便於調用。
再者是Mysql Connector C,它並不用依賴Boost庫這種,所以沒有頭文件包含方面的問題。在使用VS測試時,直接將Connector使用CMAKE編譯後生成一個mysqlclient.lib、libmysql.lib與libmysql.dll包含即可正常連接數據庫。但是在VS中使用libmysql.lib會Link找不到符號的錯誤,使用mysqlclient.lib則可以使用。(在此要說一件事,關於mysql connector c,在官網上有直接安裝版本和源碼src版本,直接安裝的都是Release版本,如需Debug版本的lib,只能自行編譯。在使用VS編譯時,注意運行庫的選擇,不過我好幾個版本生成了都有問題,但是將測試項目自身的運行庫版本更改就能用了,很迷惑)。

接下來,既然測試成功,就開始對Chromium進行修改,這裏先說一下具體的操作

  1. 將生成好的庫(libmysql.dll,libmysql.lib,mysqlclient.lib)複製到Chromium/src/out/Default文件夾下(編譯方法下面說)
  2. 在調用庫的文件添加宏 #pragma comment(lib,“libmysql.lib”),#pragma comment(lib,“mysqlclient.lib”)即可對庫進行調用。

(看上去好簡單,可是想了好久┭┮﹏┭┮,具體內容在下面講)

2.在Chromium中附加依賴庫(lib,dll)

由於google使用了一個叫GN的工具來管理他們的源代碼,所以接下來的很多東西與這個GN有關,它就跟CMAKE的功能差不多吧。

2.1 不需要編譯的源文件類外部庫

Chromium的整個項目的幾乎每個用到的文件夾下都會有一個叫做BUILD.gn的文件,這個文件便是我頭痛的來源(應該也就是我太菜了),這個gn文件中寫了編譯所需要的依賴項(deps),源文件(sources)等等配置項,具體語法google也有給文檔。
在使用外部加入的頭文件時,只需要將所需的頭源文件路徑寫入gn的source中即可(注意:換行前面四個必須是空格,不能用Tab,行尾要加逗號,即使是最後一行)。這樣,就相當於在生成時,會將該源文件編譯進該gn文件所對應的庫中了。

2.2 需要編譯的外部庫

這裏有兩種辦法
第一種:自己寫一個gn文件,放在第三方庫的文件夾下,然後在將該文件夾的路徑添加到依賴此庫的文件所在文件夾下的gn文件的deps下即可,在用Ninja生成時,他就會去尋找這些文件,然後將那個第三方庫編譯成lib或者dll。但是gn文件比較難以編寫,某些開源項目不知道具體一個lib或者dll依賴了那些文件,也沒辦法編寫gn文件,所以我沒使用這種方法。
第二種:由於Chromium是使用Ninja編譯的,所以我選擇使用CMAKE -G Ninja先Generate整個庫,這時會生成一個build.ninja文件,然後再通過使用ninja生成,去獲得lib或者dll,而後將生成的lib或者dll複製到out/default下,就可以使用了。
注:在使用CMAKE -G Ninja時,使用VS的自帶命令行打開,否則會報找不到c或者cxx編譯器的錯誤

只能說自己摸索現在能理解gn的作用與添加第三方庫的基本方法了吧 ε=(´ο`*)))唉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章