今天编译一个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.youkuaiyun.com/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 中 没有 任何被调用的函数, 则不参与命名冲突检测。