编译器参数和stdafx.h的疑惑
先描述一下我的步筹
(1)new 一个MFC share DLL 工程,常用的设置,没有特别的
(2)加入两个第三方的库,DLL形式,以LIB方式联接。然后工程设为release版本
(3)将两个库的.h文件加入myView.cpp 或是 MainFrm.cpp中,编译通过,连接时报错:
MainFrm.obj : error LNK2005: "public: class CMyDoc * __thiscall CMyView::GetDocument(void)" (?GetDocument@CMyView@@QAEPAVCUltraGateDoc@@XZ) already defined in MyView.obj
(4)将 setting --> c/c++ --> Precompiled headers 中的 use Precompiled header file(.pch) 改成 Automatic using of Precompiled headers,也就是 /Yufilename 改成 /Yx 。编译、连接正常。
(5)将这两个.h文件移入 stdafx.h 文件中,无论采用(4)中的什么参数,均报(3)中的错误。
(6)又做了几次试验,发现两个.h文件中的一个会引发上述问题,而另一个不会。
(7)可以通过/force 参数强行进行连接,运行不会出错。
我的理解:
显然,在release版中,因 CMyView::GetDocument(void)是inline形式,所以导致多个.obj编译了这个函数,所以导致(3)的问题。问题是所有的.h文件都有定义 #define AFX_LEFTVIEW_H__3C037CF9.....,按理说,应该不会导致重复定义。可是为何插入一个第三方的.h文件会引发上述错误??为何插入文件位置不同会引起不同的错误??可能的问题会处在哪里?? (那个第三方的.h文件看上去也无特别之处)/Yufilename 和 /Yx 差异在哪里??
哪位朋友能详细解释原因!! 不胜感激!!