趁着今天狀态滿滿,再寫一篇好了,說句題外話,推薦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也就是視訊對接部分的使用,進行總結歸納和代碼分析,若文章中有什麼不正确的地方歡迎指正,大家共同學習進步!