Static Lib Multiple Definition Link Ошибка - PullRequest
0 голосов
/ 04 апреля 2009

Поэтому я пытаюсь создать небольшой 3D-движок в качестве упражнения на VC ++ 8.0. У меня есть статическая библиотека MathLib и статическая библиотека Render, которая связана с моим exe-файлом TestBed. Сейчас у Render есть два класса: Color и DXManager3D. Цвет включает в себя мой Vector.h от MathLib просто отлично, никаких проблем.

Во второй раз, когда я пытаюсь включить Vector.h в DXManager3D, он обрушивается на меня, говоря, что символ определен дважды, а второе определение игнорируется (предупреждение из lib). Я подумал, что, возможно, включение его дважды вызвало это, поэтому в качестве теста я удалил Vector.h из Color.h и оставил его в DXManager3D.h - та же проблема. Я проверил трижды, чтобы убедиться, что у меня все завернуто в ifndef для защиты от этого, поэтому я остаюсь почесывая голову.

DXManager3D.obj: предупреждение LNK4006: «public: __thiscall Math :: Vector :: Vector (void)» (?? 0Vector @ Math @@ QAE @ XZ) уже определено в Render.obj; второе определение игнорируется

Что меня действительно смущает, так это то, что когда я собираю Render.lib отдельно от TestBed, он не должен ничего связывать, так как это статическая библиотека, верно? Я все еще получаю предупреждения об определении нескольких символов. Если я создаю экземпляр DXManager3D в основном, мои предупреждения становятся ошибками.

Render.lib (DXManager3D.obj): ошибка LNK2005: «public: __thiscall Math :: Vector :: Vector (void)» (?? 0Vector @ Math @@ QAE @ XZ) уже определена в WinMain.obj

Да, у меня есть F1'd LNK4006 и LNK2005, и решения в MSDN у меня не работают. Извините, если этот вопрос задавался ранее, я не смог найти ничего хорошего, чтобы помочь мне с помощью функции поиска.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 апреля 2009

Определен ли ваш Vector ctor в заголовке за пределами определения класса? Сделайте это встроенным, то есть измените

class Vector {
  public:
    Vector();
  // ...
}; 

Vector::Vector() {
   // ...
}

до

class Vector {
  public:
  Vector() {}
  // ...
}; 

или используйте явную inline квалификацию:

class Vector {
   public:
  Vector();
  // ...
}; 

inline Vector::Vector() {
   // ...
}
1 голос
/ 04 апреля 2009

Похоже, у вас есть проблема с вашим векторным классом. Исходя из вашей информации, кажется, что класс связан с любой библиотекой, которая включает файл заголовка. Это внутренняя связь, и вы действительно хотите внешнюю связь.

Можете ли вы опубликовать содержимое Vector.h или хотя бы конструктор Vector ()? Это должно дать нам ключ к пониманию того, что на самом деле происходит.

Связь: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr020.htm

EDIT

Судя по вашим комментариям, вы объявили все функции в заголовочном файле за пределами библиотеки классов. Вы должны поместить их в файл без заголовка (например, файл Vector.cpp).

Это даст вашей программе соответствующую связь, и вы сможете включить Vector.h в обе программы.

...