2014-12-30 2 views
0

Я искал здесь и нашел этот вопрос много раз, но автор обычно не представил пример кода, я столкнулся с этой проблемой сегодня, и я не совсем уверен, как это исправить.Ошибка Linker LNK2005

1 из них bool Init([email protected]@A_NA) already defined in Client.obj. Вот часть моего кода для Client.cpp, Main.cpp и Main.h.

client.cpp

#include "stdafx.h" 
#include "Main.h" 
// the rest of the code doesn't have anything to do with this error.. 

main.h

#include "stdafx.h" 
bool Init; 
// the rest of the code doesn't have anything to do with this error.. 

main.cpp

#include "stdafx.h" 
#include "Main.h" 

int main() 
{ 
    Init = false; 
    return 0; 
} 

ответ

2

В #include "Main.h" вы определили bool Init;, поэтому каждый раз, вы включаете Main.h, вы получит Init переопределено. Если вы Init статический

static bool Init; 

Здесь Init будет иметь объем на уровне страницы, и ваш код должен работать нормально.

Или лучше, вы делаете Init EXTERN в Math.h,

extern bool Init; 

Затем в .cpp файле определить его, так что вы будете иметь несколько декларацию, но одно определение.

+0

Лучше иметь его в заголовке и определять в одном файле cpp, если вы должны использовать глобальные переменные. –

+0

@RetiredNinja Тем не менее, это будет мешать другим глобальным 'Init', ваш подход в целом правильный, но OP имеет клиентскую библиотеку, которая уже определила' Init'. –

+0

Я не вижу, что он вообще использует библиотеку. У него явно есть два файла cpp и переменная, объявленная в заголовке, что вызывает множественную ошибку определения. Если вы сделаете его статическим, ошибка исчезнет, ​​но каждый файл cpp будет иметь другую переменную. Если вы extern его и определить его в одном месте, то оба имеют одну и ту же переменную. –