今天編譯一個MFC DLL, 鏈接時遇到 錯誤提示:
1>正在鏈接...
1>mfcs80ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已經在 CapAudio.obj 中定義
1> 正在創建庫 ..\bin\CapAudio.lib 和對象 ..\bin\CapAudio.exp
1>..\bin\CapAudio.dll : fatal error LNK1169: 找到一個或多個多重定義的符號
1>生成日誌保存在“file://d:\work\VLC-custom\bin\CapAudio\Debug\BuildLog.htm”
1>CapAudio - 2 個錯誤,4 個警告
參考
http://blog.csdn.net/aastoneaa/article/details/7715221 的方法:
發現:
1> 已加載 mfcs80ud.lib(stdafx.obj)
1> 已找到 "class AFX_MODULE_STATE * __stdcall AfxGetStaticModuleState(void)" (?AfxGetStaticModuleState@@YGPAVAFX_MODULE_STATE@@XZ)
1> 已在 DllExport.obj 中引用
1> 已加載 mfcs80ud.lib(dllmodul.obj)
1>mfcs80ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已經在 CapAudio.obj 中定義
MFC DLL 設置的 是 MFC EXT 方式, wizard生成的代碼中包括 DllMain(),
但是輸出函數中,按照USERDLL的方式 使用了
AFX_MANAGE_STATE(AfxGetStaticModuleState()) 導致的。
將這一句註釋即可。
可見:
C/C++鏈接的時候是按照 .obj 進行的。一旦調用了lib中 某個.obj中的函數,這個obj中的其他函數都會參與鏈接函數命名衝突檢測。
如果這個obj 中 沒有 任何被調用的函數, 則不參與命名衝突檢測。