編譯webrtc
就挺困難的,因爲要訪問的工具、代碼倉庫等等都很不容易,編譯完成後,拿webrtc.lib
到項目裏一集成,你可能就會遇到這個問題:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
如果用的是中文版的VC++,如錯信息是這樣的
error LNK2038: 檢測到“_ITERATOR_DEBUG_LEVEL”的不匹配項: 值“0”不匹配值“2”(main.obj 中) 錯誤
但是,你還會發現在Release模式編譯鏈接就沒有這個錯誤哦。
你去搜索,可以發現原因是“當前工程是Debug版本,而引用的庫文件時Release版本”,然後你就去編譯了一個Debug版本的webrtcd.lib
,然而,還是有這個錯誤,這時候你再全網搜索也找不到正確答案了,但有可能找到一個不完美的答案,那就是在項目中定義_ITERATOR_DEBUG_LEVEL=0
,鏈接錯誤沒有了,但運行起來可以會突然間崩潰,進程退出,影響開發和調試。
我去翻了gn args --list <out_dir>
命令的幾百個參數,看花了眼睛,才終於徹底解決這個問題,這就是爲什麼我要在這裏寫來的原因:希望讀者能在這裏快速找到解決方案。
我強烈建議編譯webrtc
時,分開Debug和Release兩個版本,它默認的編譯參數是Release的。方法是在生成Debug版本時,執行gn gen out/Debug --args="is_debug=true"
,而生成Release版本時執行gn gen out/Release --args="is_debug=false"
。
很高興在這裏引出args
參數,其實除了is_debug
還有很多參數可以加上去,上文說過了,有幾百個。如果你有很多參數通過命令行傳遞過去的話,你會煩死的,所以gn
其實支持參數文件,你細心找一下,會在out/Debug
和out/Relaese
有一個args.gn
文件,你用記事本打開,發現之前傳遞的is_debug=true
參數正好好地躺在裏面呢。
回到正題,_ITERATOR_DEBUG_LEVEL
不匹配的解決方案就是在Debug版本的args.gn
中寫入enable_iterator_debugging=true
參數,然後再執行gn gen out/Debug
重新生成文件,再調用ninja
編譯就可以了。
不過,要記得在Release版本中不要加這個參數。