2015-06-24 4 views
0

Я пишу приложение 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-файлов, и я нашел различные вещи, которые определяются более одного раза, но поскольку файлы сгенерированы автоматически, я не уверен, как исправить эту проблему?

+0

Включите только один из них, включите COMObject_i.h или включите «COMObject_i.c». Во всяком случае, почему вы включаете c-файл? – JTejedor

+0

@JTejedor Если я включу только .h, он не будет компилироваться, жалуясь, что отсутствуют различные определения. То же самое происходит, если я включаю только .c – innova

+0

. Вы действительно включаете дважды файл «COMObject_i.h», потому что внутри «COMObject_i.c», я полагаю, вы включаете заголовочный файл внутри «COMObject_i.c» ... Итак, вы дублируете определения заголовка «COMObject_i.h» .... так что несколько определений, таких как _CLSID_COMObjectInterface, уже определены. Просто включите 1 файл как файла заголовка, так и исходного файла. – JTejedor

ответ

1

Не делать:

#include "COMObject_i.c" 

Вместо этого добавьте COMObject_i.c в виде файла в ваш проект.

.c или .cpp файлы должны быть скомпилированы отдельно, а не #include d. В частности, файл C не должен включаться в файл C++!

Возможно, это «работает» в этом случае, чтобы включить его только от main.cpp, но это плохой стиль.

+0

Это работает отлично, не могу поверить, что я не просто подумал об этом, прежде чем я сделал этот вопрос... – innova

Смежные вопросы