天天看點

Ubuntu下基于Qt架構,使用WebRtc開發總結(三):gn配置和ninja建構檔案分析.gn檔案.ninja檔案

趁着今天狀态滿滿,再寫一篇好了,說句題外話,推薦WebRtc的Google讨論組的位址:谷歌讨論組,注冊了谷歌賬号,在裡面登入以後就可以想貼吧論壇一樣使用了,高手很多,很多問題可以在裡面得到解答,當然,前提是英語要過得去,能夠描述清楚自己的問題,并且能看懂回複2333333。

那麼這一部分是對gn和ninja的分析總結,由于gn和ninja官網寫的東西實在太多了,完全不夠時間去讀,是以,除了很基礎的文法,大部分的解讀完全是靠語義和檔案結構來進行的分析,覺得不靠譜的可以不看就是了,不過确實能根據這些經驗總結來改WebRtc的編譯配置。

.gn檔案

首先先說實話,這個總結會比較淩亂,因為沒有系統的去了解過gn工具,想到哪裡寫到哪裡,如果要用的話,選自己需要的部分看就好了。

個人對于gn和ninja的大體了解是通過和cmake比較的,gn檔案就相當于cmakelist,執行了gn gen操作,就類似于執行了cmake語句,那一般在build目錄下面就生成了.ninja和.stamp檔案,然後ninja編譯器通過.ninja檔案,把代碼編譯成可執行檔案.o,然後把.o檔案連結起來,組成可執行程式或者庫檔案。也就是平時的cmake->make變成了gn gen->ninja的這麼一個過程。

用一個具體一點的gn檔案來說明吧,以src/exmaples檔案夾下的BUILD.gn舉例,重要的部分分為下面幾個:

1、import("../webrtc.gni")

好了解,類似于導入頭檔案,.gni檔案就相當于gn的頭檔案,在webrtc.gni裡,進行了一些函數的聲明定義,可以在裡面進行修改。接下來列舉的部分,多數也都是這個頭檔案裡面定義的函數,是以如果需要自定義編譯的話,就去修改之。

2、group("examples")

了解成一個類吧,或者一個對象,一個包含了多個庫或可執行檔案的組。

3、rtc_android_library、rtc_static_library、rtc_executable等等自定義函數,如果不做修改的話,可以直接把代碼的.h和.cc檔案放進去後,添加到對應的函數裡面,後面括号裡寫生成的名字,就可以利用gn和ninja來編譯了,不過我是用Qt架構做,自然不需要這麼幹,不過我是嘗試過的,确實是可以生成對應的庫檔案或是可執行檔案。

4、testonly = true

這個東西是WebRtc用來測試的時候,加的開關,在生成的時候會檢測這個狀态,預設是關閉的,如果是開着的,那編譯出來的庫是不可用的,因為是testonly,根據自己需要去調整吧,有些時候,一些測試類和測試庫還是會用到的,注釋掉這一行就可以了。

5、sources = [] / sources +=

用來添加.h和.cc檔案,後面跟着需要添加的源碼檔案的頭檔案路徑和實作檔案路徑。

6、deps = [] /  deps +=

用來添加依賴的,添加group或是rtc_static_library,如果是添加group,會記錄group裡面成員的依賴關系,在執行gn操作的時候,把依賴都添加進來。

7、libs = [] / libs += []

添加動态庫的依賴。

題外話,5/6/7這三個以及其他的涉及+=和=的,應該多少都能看出來,=的話是直接指派,也就是如果預設有值,或者之前設過值的話,=操作以後會覆寫掉,而不會保留,+=操作則會。

上面是最常用到的地方,剩下的例如config,cflags等等的東西,都需要自己去讀gn檔案和gni檔案,來根據自己的需求進行修改。

順帶一提,我在最開始引用WebRtc靜态庫的時候,各種報錯,例如使用c++庫的不同,導緻編譯的時候,識别不出來作為參數傳遞的sdt::string,找不到函數實作等等。最坑爹的莫過于找不到函數實作,那麼我排查下來,發現是找不到../api/audio_codecs:builtin_audio_decoder_factory的靜态庫,原因是該靜态庫的上層檔案夾的gn檔案沒有把它加入deps,那麼在我修改了gn檔案後,解決了這個問題。如果有人出現了類似的,引用了libwebrtc.a,卻找不到函數實作的問題,可以從這個方向進行排查。

.ninja檔案

這個了解的并不多,也沒修改過,因為是自動生成的,也就講一講大概裡面都有什麼。

裡面的話會有很多的編譯宏定義,include檔案夾位置,編譯出來的可執行檔案.o的名字,輸出目錄,以便ninja編譯器對源碼進行編譯。

同時會生成.stamp檔案,但是這個檔案什麼用,我可恥的忘記了。。。

那麼,經過前三部分的總結,應該就可以在Qt中使用WebRtc的庫了,下面的部分将陸陸續續對WebRtc中PeerConnection也就是視訊對接部分的使用,進行總結歸納和代碼分析,若文章中有什麼不正确的地方歡迎指正,大家共同學習進步!

繼續閱讀