【问题标题】:'Link error: already defined' when using COM interface使用 COM 接口时出现“链接错误:已定义”
【发布时间】: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。

标签: c++ com linker


【解决方案1】:

不要这样做:

#include "COMObject_i.c"

改为将COMObject_i.c 作为文件添加到您的项目中。

.c.cpp 文件应该单独编译,而不是#include d.尤其是 C 文件不应该包含在 C++ 文件中!

在这种情况下它可能会“工作”,仅从main.cpp 包含它,但这是一种糟糕的风格。

【讨论】:

  • 这很好用,不敢相信在我提出这个问题之前我并没有想过这样做......
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 2012-10-06
  • 1970-01-01
  • 2014-10-05
  • 2019-11-25
  • 1970-01-01
  • 2013-12-29
  • 2019-07-03
相关资源
最近更新 更多