2009-04-04 2 views
0

Итак, я пытаюсь создать небольшой 3D-движок в качестве упражнения на VC++ 8.0. У меня есть статическая библиотека MathLib и Render static lib, связанная с моим exe testBed. Прямо сейчас Render имеет два класса: Color и DXManager3D. Цвет включает в себя мой Vector.h из MathLib просто отлично, никаких проблем.Static Lib Ошибка множественного определения связи

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

DXManager3D.obj: предупреждение LNK4006: "общественность: __thiscall Math :: Vector :: Vector (аннулируются)" (?? 0Vector @ Math @@ QAE @ XZ) уже определены в Render.obj; второе определение игнорируется

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

Render.lib (DXManager3D.obj): ошибка LNK2005: "общественность: __thiscall Math :: Vector :: Vector (аннулируются)" (?? 0Vector @ Math @@ QAE @ XZ) уже определены в WinMain. obj

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

Спасибо!

ответ

2

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

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

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

к

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

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

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

inline Vector::Vector() { 
    // ... 
} 
+0

Все мои определения определены в заголовке вне определения класса. – 2009-04-04 19:24:30

+0

Aha! Это проблема. Я дал вам возможное решение (ы). См. Мои примеры выше. – dirkgently

+0

Сделайте все определения inline, следуйте последнему примеру для более длинных функций, а для более коротких - второму. Ура! – dirkgently

1

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

Можете ли вы разместить содержимое 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 в обе программы.

+0

Вектор :: Vector (Недействительными) { // ничего не делать! } класс { \t класс друга Матрица; Публикация: \t Vector (void) {} ​​ \t Вектор (НЕ УКАЗАН); \t Вектор (ZERO); \t Вектор (int x, int y, int z = 0, int w = 0); \t Вектор (float x, float y, float z = 0.f, float w = 0.f); \t ~ Vector (аннулируются) \t { \t} .. больше вещей .. } – 2009-04-04 19:22:50

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