【发布时间】:2015-06-24 20:12:24
【问题描述】:
我正在 VS2013 中编写一个使用 COM DLL 库的 Win32 C++ 控制台应用程序。我已经添加了文件:
- COMObject_i.c
- COMObject_i.h
到我的项目。
最初,我开始使用如下代码处理一个文件:
Main.cpp
#include "COMObject_i.h"
#include "COMObject_i.c"
int _tmain(int argc, _TCHAR* argv[])
{
// Setup and use COM object interface...
}
这段代码运行良好,我能够构建 COM 对象接口并在其上调用方法。 然而,现在我正在前进,我想将 COM 对象接口设置移动到不同的类。当尝试这样做时,我得到这样的代码:
COMObjectWrapper.h
#pragma once
#include "COMObject_i.h"
#include "COMObject_i.c"
class COMObjectWrapper
{
// Class declaration
}
COMObjectWrapper.cpp
#include "COMObjectWrapper.h"
// Class method definitions
Main.cpp
#include "COMObjectWrapper.h"
int _tmain(int argc, _TCHAR* argv[])
{
// Use COM object wrapper
}
这不会编译并给我一些看起来像这样的链接器错误:
error LNK2005: _CLSID_COMObjectInterface already defined in COMObjectWrapper.obj
error LNK2005: _IID_ICOMObjectInterface already defined in COMObjectWrapper.obj
error LNK2005: _LIBID_ICOMObjectLib already defined in COMObjectWrapper.obj
我尝试将 Main.cpp 中的 #include 移动到 Main.h 中,但没有帮助。我尝试查看 COMObject_i 文件,发现不止一次定义了各种内容,但由于文件是自动生成的,我不确定如何解决问题?
【问题讨论】:
-
只调用一个include,这包括COMObject_i.h,或者包括“COMObject_i.c”。反正你为什么要包含一个c文件?
-
@JTejedor 如果我只包含 .h 它将无法编译,抱怨缺少各种定义。如果我只包含 .c
-
您确实包含了文件“COMObject_i.h”的两倍,因为在“COMObject_i.c”中,我想您将头文件包含在“COMObject_i.c”中......所以您正在复制标题定义“COMObject_i.h” ....so 几个定义,如 _CLSID_COMObjectInterface 已经定义。只需包含两者的 1 个文件,即头文件或源文件。
-
恐怕不是,查看预生成的 .c 文件显示它根本不包含 .h 文件,实际上创建了更多定义,例如:“MIDL_DEFINE_GUID(CLSID, CLSID_COMObjectInterface, 0x3A....) 可以在里面看到。链接器很不高兴,因为它认为它有两个非常奇怪但必要的 .c 文件的副本...
-
这个:
#include "COMObject_i.c"不属于你的包装头。它包含接口和类 id 定义(不仅仅是声明),并且应该只在 one 翻译单元中。将其移动到 wrapper.cpp 文件、其他一些 .cpp 文件,或者将其添加到源文件列表中并禁用该文件的 pch。