當webrtc遇上_ITERATOR_DEBUG_LEVEL

編譯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/Debugout/Relaese有一個args.gn文件,你用記事本打開,發現之前傳遞的is_debug=true參數正好好地躺在裏面呢。


回到正題,_ITERATOR_DEBUG_LEVEL不匹配的解決方案就是在Debug版本的args.gn中寫入enable_iterator_debugging=true參數,然後再執行gn gen out/Debug重新生成文件,再調用ninja編譯就可以了。

不過,要記得在Release版本中不要加這個參數。

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