Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

already defined in...

18K
21 июня 2006 года
RdR
4 / / 21.06.2006
Всем привет.
Столкнулся с проблемой и не знаю как ее решить или обойти. Пытаюсь разобраться с ошибкой : 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

 
Код:
// types.h
#include <windows.h>

#define INIT(p) { p = NULL; }
#define SAFE_DELETE(p) { if(p) { delete (p); p = NULL; } }

Код:
// Basic.h
#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; };
};

 
Код:
// C2.h
#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; };
};

Код:
// 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;
};


При компиляции ошибок не выдает. Выполняется. Но если я изменяю класс cx2 так :
 
Код:
// C2.h
#include "Basic.h"

class cx2 : public cxBasic
{
public:
    cx2() { };
    void SetGlobal();
};

а описание функции вывожу в отдельный файл C2.cpp
 
Код:
#include "C2.h"

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...?
4
21 июня 2006 года
mike
3.7K / / 01.10.2002
Убери объявление переменных из .h файлов. Обявляй в .c/.cpp и используй extern если надо.
18K
21 июня 2006 года
RdR
4 / / 21.06.2006
[QUOTE=mike]Убери объявление переменных из .h файлов. Обявляй в .c/.cpp и используй extern если надо.[/QUOTE]
Можешь по конкретнее написать?
Просто я уже до того запарился, что видимо уже простых вещей не вижу.
А переменная global бедет оставаться глобальной для всего проекта?
18K
21 июня 2006 года
RdR
4 / / 21.06.2006
[QUOTE=mike]Убери объявление переменных из .h файлов. Обявляй в .c/.cpp и используй extern если надо.[/QUOTE]
Щас добавил файл Basic.cpp в проект в котором прописал
 
Код:
#include "Basic.h"
int global

а в файле Basic.h изменил
 
Код:
int global

на
 
Код:
extern int global


я правильно тебя понял?
398
22 июня 2006 года
Alexandoros
630 / / 21.10.2005
>>я правильно тебя понял?
Да.
теперь еще нужно будет добавить extern int global во все модули где она используется.
18K
22 июня 2006 года
RdR
4 / / 21.06.2006
Всем огромное спасибо.
Премного благодарен.
350
27 июня 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=Alexandoros]
теперь еще нужно будет добавить extern int global во все модули где она используется.[/QUOTE]
Скорее всего, нет, т. к. extern int global осталось в базовом header'е.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог