近期參與的項目中使用了公司另外一個同事提供的一個靜態庫文件。該靜態庫文件集成了CUDA, OpenCL兩個庫,用於做圖形加速計算,提高視頻解碼拼接速度。但是在編譯鏈接項目時,VS爆出如下錯誤:
1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_a 已經在 MSVCRT.lib(cinitexe.obj) 中定義 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_z 已經在 MSVCRT.lib(cinitexe.obj) 中定義 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xc_a 已經在 MSVCRT.lib(cinitexe.obj) 中定義 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xc_z 已經在 MSVCRT.lib(cinitexe.obj) 中定義
編譯階段並沒有出現錯誤,根據VS輸出判斷是符號重定義。但是,如上提示中的符號“__xi_a”等並沒有出現在源代碼中。因此判斷可能是庫的版本不對。查看一下工程的屬性配置,右鍵選擇工程->屬性->C/C++->代碼生成->運行庫:
可以看到主工程使用了“多線程DLL(/MD)”版本的運行庫,而同時開發靜態庫時使用了“多線程調試(/MTd)”的配置:
顯然在編譯鏈接的時候會產生錯誤,導致無法正常生成可執行程序。將靜態庫工程和主工程的運行時庫的版本設置為一致的就可以解決問題了。另外,網上還提供了一種新的方法來查看工程鏈接的具體靜態庫路徑:在“屬性->鏈接器->常規->顯示進度”中進行選擇。
參考鏈接
1. http://stackoverflow.com/questions/5249431/linker-trouble-how-to-determine-where-a-defaultlib-is-coming-from/16899011#16899011
2. http://stackoverflow.com/questions/20918729/what-is-causing-vs2013-error-lnk2005-xi-a-already-defined-in-msvcrt-libcinit
3. http://stackoverflow.com/questions/2728649/error-lnk2005-xxx-already-defined-in-msvcrt-libmsvcr100-dllc-something-libc