XLW是一个开源库,它将C ++代码包装到Excel的XLL加载项中。在我正在处理的项目中报告了一个奇怪的LNK4006错误,报告XLW功能已“已定义”。
我正在使用XLW version 4.0.0.f0,为了简化情况,我把它分解为一个玩具项目,只有三个文件 -
StdAfx.cpp,boilterplate文件:
#include "stdafx.h"
StdAfx.h,boilterplate但神秘(我从不理解内容)
#if !defined(AFX_STDAFX_H__0D719468_50D1_11D2_9DAF_00207813663F__INCLUDED_)
#define AFX_STDAFX_H_0_D719468_50D1_11D2_9DAF_00207813663F__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__0D719468_50D1_11D2_9DAF_00207813663F__INCLUDED_)
然后是拼图,WhyLNK4006.cpp:
#include <xlw/xlw.h>
void WhyLNK4006()
{
xlw::XlfExcel &x = xlw::XlfExcel::Instance();
xlw::XlfExcel::Instance().FreeMemory();
}
这会触发LNK4006错误,我可以将其作为警告抑制,但无法猜测为什么会发生这种情况:
xlw-vc120-mt-gd-4_0_0f0.lib(XlfExcel.obj):警告LNK4006:“public: void __thiscall xlw :: XlfExcel :: FreeMemory(bool)“ (?FreeMemory @ XlfExcel @ xlw @@ QAEX_N @ Z)已在B15.obj中定义; 忽略第二个定义
我无法理解,为什么会出现这样的错误?
XLW和我的玩具项目都编译为/MTd
,所有XLW头文件XXX.h都有预处理器保护,例如。
> #if !defined(XXX_H)
> #define XXX_H //the read content of XXX.h
> #endif
为什么这会导致双重定义?