Я пишу приложение Win32 C++ Console в VS2013, которое использует библиотеку COM DLL. Я добавил файлы:«Ошибка связи: уже определена» при использовании интерфейса COM
- 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
Я попытался переместить #include в main.cpp к main.h и это не помогло. Я пробовал искать внутри COMObject_i-файлов, и я нашел различные вещи, которые определяются более одного раза, но поскольку файлы сгенерированы автоматически, я не уверен, как исправить эту проблему?
Включите только один из них, включите COMObject_i.h или включите «COMObject_i.c». Во всяком случае, почему вы включаете c-файл? – JTejedor
@JTejedor Если я включу только .h, он не будет компилироваться, жалуясь, что отсутствуют различные определения. То же самое происходит, если я включаю только .c – innova
. Вы действительно включаете дважды файл «COMObject_i.h», потому что внутри «COMObject_i.c», я полагаю, вы включаете заголовочный файл внутри «COMObject_i.c» ... Итак, вы дублируете определения заголовка «COMObject_i.h» .... так что несколько определений, таких как _CLSID_COMObjectInterface, уже определены. Просто включите 1 файл как файла заголовка, так и исходного файла. – JTejedor