// types.h
#include <windows.h>
#define INIT(p) { p = NULL; }
#define SAFE_DELETE(p) { if(p) { delete (p); p = NULL; } }
already defined in...
Столкнулся с проблемой и не знаю как ее решить или обойти. Пытаюсь разобраться с ошибкой : error LNK2005: "int global" (?global@@3HA) already defined in test.obj. Помогите разобраться:
Структура проекта такова:
1. Файл types.h, в котором описываю макросы #define и подключаю библиотеки.
2. Файл Basic.h содержит базовый класс для всех остальных и включает файл types.h (#include "types.h")
3. Файлы C1.h, C2.h ... Cn.h которые описывают "рабочие классы". Каждый из них включает файл Basic.h (#include "Basic.h"), а классы наследуют базовый класс описанный в Basic.h (class cx1 : public Basic)
4. Файл Main.h содержит сводный класс наследующий также базовый, который включает файлы рабочих классов(#include "С1.h" #include "C2.h") и в котором находятся объекты классов С1, С2, ... и т.д.
5. Файл test.cpp который содержит тестовый класс который наследует сводный класс.
----------------------------- types.h
--------------------------------|
------------------------------Basic.h
---------------------------/--/--|--\--\
------------------------C1.h C2.h ...... Cn.h
---------------------------\--\--|--/--/
-------------------------------Main.h
---------------------------------|
-------------------------------test.cpp
Код:
Код:
// Basic.h
#ifndef __BASIC_H__
#define __BASIC_H__
#include "Types.h"
int global;
class cxBasic
{
public:
cxBasic() { Status = 0; };
int Status;
};
#endif
#ifndef __BASIC_H__
#define __BASIC_H__
#include "Types.h"
int global;
class cxBasic
{
public:
cxBasic() { Status = 0; };
int Status;
};
#endif
Код:
// C1.h
#include "Basic.h"
class cx1 : public cxBasic
{
public:
cx1() { };
void SetGlobal() { global = 2; };
};
#include "Basic.h"
class cx1 : public cxBasic
{
public:
cx1() { };
void SetGlobal() { global = 2; };
};
Код:
// C2.h
#include "Basic.h"
class cx2 : public cxBasic
{
public:
cx2() { };
void SetGlobal() { global = 3; };
};
#include "Basic.h"
class cx2 : public cxBasic
{
public:
cx2() { };
void SetGlobal() { global = 3; };
};
Код:
// Main.h
#include "C1.h"
#include "C2.h"
class cxMain : public cxBasic
{
public:
cxMain() { L1 = new cx1; L2 = new cx2; };
~cxMain() { SAFE_DELETE(L1); SAFE_DELETE(L2); };
cx1* L1;
cx2* L2;
void SetGlobal() { global = 5; };
};
#include "C1.h"
#include "C2.h"
class cxMain : public cxBasic
{
public:
cxMain() { L1 = new cx1; L2 = new cx2; };
~cxMain() { SAFE_DELETE(L1); SAFE_DELETE(L2); };
cx1* L1;
cx2* L2;
void SetGlobal() { global = 5; };
};
Код:
// test.cpp
#include "Main.h"
class App : public cxMain
{
public:
App() { my = 1; };
int my;
};
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
App app;
global = 0;
app.SetGlobal();
app.L1->SetGlobal();
app.L2->SetGlobal();
return 0;
};
#include "Main.h"
class App : public cxMain
{
public:
App() { my = 1; };
int my;
};
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
App app;
global = 0;
app.SetGlobal();
app.L1->SetGlobal();
app.L2->SetGlobal();
return 0;
};
При компиляции ошибок не выдает. Выполняется. Но если я изменяю класс cx2 так :
Код:
// C2.h
#include "Basic.h"
class cx2 : public cxBasic
{
public:
cx2() { };
void SetGlobal();
};
#include "Basic.h"
class cx2 : public cxBasic
{
public:
cx2() { };
void SetGlobal();
};
а описание функции вывожу в отдельный файл C2.cpp
Код:
#include "C2.h"
void cx2::SetGlobal()
{
global = 333;
};
void cx2::SetGlobal()
{
global = 333;
};
то вылетает ошибка линковщика:
C2.obj : error LNK2005: "int global" (?global@@3HA) already defined in test.obj
Debug/TestEx.exe : fatal error LNK1169: one or more multiply defined symbols found
Можно ли как-то обойти эту ошибку без опции /FORCE:MULTI...?
Убери объявление переменных из .h файлов. Обявляй в .c/.cpp и используй extern если надо.
Можешь по конкретнее написать?
Просто я уже до того запарился, что видимо уже простых вещей не вижу.
А переменная global бедет оставаться глобальной для всего проекта?
Щас добавил файл Basic.cpp в проект в котором прописал
Код:
#include "Basic.h"
int global
int global
а в файле Basic.h изменил
Код:
int global
на
Код:
extern int global
я правильно тебя понял?
Да.
теперь еще нужно будет добавить extern int global во все модули где она используется.
Премного благодарен.
теперь еще нужно будет добавить extern int global во все модули где она используется.[/QUOTE]
Скорее всего, нет, т. к. extern int global осталось в базовом header'е.