鏈接警告 LNK4098
defaultlib "library" conflicts with use of other libs; use /NODEFAULTLIB:library
你試圖鏈接相互不兼容的庫。
重要提示 目前運行時庫包含預編譯指令來阻止混合不同類型庫的鏈接。如果你試圖在同一個程序中使用不同類型的或者調試/非調試版本的運行時庫,你將看到這個警告。舉個例子,如果你編譯一個文件使用某個類型的運行時庫,而別的文件使用另外一個類型(例,單線程版本和多線程版本),那麼在你試圖鏈接它們的時候,你將看到這個警告。你應該使用相同的運行時庫來編譯所有的源文件。參閱MSDN中的Use Run-Time Library 章節瞭解關於(MD, /ML, /MT, /LD)編譯開關的更多信息。
你可以使用鏈接開關/VERBOSE:LIB來了解鏈接器在搜索哪個庫。如果你試圖創建一個使用單線程非調試版本運行庫的執行文件時收到LNK4098警告,那麼使用/VERBOSE:LIB參數來找出鏈接器在搜索哪個庫。鏈接器應該列出搜索的庫LIBC.LIB,而不是LIBCMT.LIB, MSVCRT.LIB, LIBCD.LIB, LIBCMTD.LIB, 或者MSVCRTD.LIB等庫。你可以通過在VC開發環境項目 Project 設置 Settings 鏈接Link 頁面中的Ignore Libraries編輯框中輸入不正確的運行時庫名告訴鏈接器忽略這些運行時庫,或者可以使用/NODEFAULTLIB:library 的鏈接開關來忽略那些不正確的庫。參閱MSDN中 Ignore Libraries 章節瞭解(/NODEFAULTLIB)鏈接開關的更多信息。
下面的表中列出了在你選擇不同運行時庫時應該被忽略的庫。
使用的運行時庫 | 被忽略的庫 |
單線程 (libc.lib) | libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
多線程 (libcmt.lib) | libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
多線程DLL (msvcrt.lib) | libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib |
調試版單線程 (libcd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib |
調試版多線程 (libcmtd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib |
調試版多線程DLL (msvcrtd.lib) | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib |
舉例,如果你試圖創建一個使用單線程非調試版運行時庫的執行文件時,收到這個警告信息,你可以使用下面參數來鏈接:
/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB