Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
#1

Многократно объявленый символ - C++

15.12.2013, 14:34. Просмотров 280. Ответов 4
Метки нет (Все метки)

Здравствуй CyberForum! У меня проблема с использованием нескольких cpp файлов.
Есть три файла: core.cpp, core.h и SThread.cpp. При этом Сore.cpp и SThread.cpp используют глобальные переменные и прототипы объявленные в core.h. Вот содержание core.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef __ClearSky
#define __ClearSky
 
 
#include <string>
#include <Windows.h>
#include <windowsx.h>
#include <fstream>
#include <gl\GL.h>
#include <strsafe.h>
 
//Синхронизирует работу потоков
HANDLE EventHandler;
 
//Прототипы
void DrawMarkerOnPosition(int x, int y, HWND hwnd);
BOOL WINAPI InitThreads();
void WINAPI CloseThreads();
DWORD SoundThreadEntryPoint();
void ShowMessage(int x, int y, LPWSTR text);
void ShowError();
DWORD DoTestThread();
void DrawOnDesktop();
//Тут глобальные переменные
CRITICAL_SECTION SYNC_stuff;
bool bDraw;
bool bUpdate;
#endif
А вот пример инклуда, но тут все просто. Файл SThread.cpp :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "Core.h"
 
 
DWORD SoundThreadEntryPoint()
{
SoundThreadStart:
    DWORD result = WaitForSingleObject(EventHandler, INFINITE);
    if (result == 0xffffffff) ShowError();
    //Start load DLL test code
 
    HMODULE TestDLLModule = GetModuleHandle(L"binkw32");
    if (TestDLLModule == NULL)
    {
        ShowMessage(100, 100, L"Module not loaded yet, try to load...");
        ResetEvent(EventHandler);
        TestDLLModule = LoadLibrary(L"binkw32");
        if (TestDLLModule == NULL)
        {
            ShowError();
        }
        else
        {
            ShowMessage(100, 150, L"Module load complete");
        }
        goto SoundThreadStart;
    }
    else
    {
        ResetEvent(EventHandler);
        ShowMessage(100, 200, L"Module already loaded, calling function!");
        FARPROC RADTimerRead = GetProcAddress(TestDLLModule, "_RADTimerRead@0");
        if (RADTimerRead == NULL)
        {
            ShowError();
        }
        LPWSTR message = new WCHAR[30];
        while (true)
        {
            EnterCriticalSection(&SYNC_stuff);
            if (bUpdate == false)
            {
                LeaveCriticalSection(&SYNC_stuff);
                break;
            }
            LeaveCriticalSection(&SYNC_stuff);
            int FinalResult = RADTimerRead();
            wsprintf(message, L"Returning value is: %d", FinalResult);
            ShowMessage(100, 250, message);
            Sleep(5);
        }
        delete[] message;
        goto SoundThreadStart;
    }
    return 0;
}
Файл core.cpp очень большой, и там такая же строка как и в SThread.cpp в начале .
Компилятор, вернее, линковщик ругается почему-то конкретно на глобальные переменные, объявленные в core.h.
Если core.cpp и SThread.cpp объединить в один файл, то все работает, но получается сплошная куча кода -_-.
Помогите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2013, 14:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Многократно объявленый символ (C++):

обнаружен многократно определенный символ - C++
Добрый вечер. Никак не могу избавится от такой ошибки. Она возникает, как только я добавляю в WoWChat.cpp include &quot;WoWChat.h&quot;. ...

Многократно определенный символ. Где? - C++
Подскажите пожалуйста, где многократно определенный символ? Начал разбираться в работе с классами, но вот ошибка не даёт покоя, в чем...

Обнаружен многократно определенный символ - один или более - C++
Здравствуйте. Выскакивает ошибка: error LNK1169: обнаружен многократно определенный символ - один или более. А из-за чего не пойму....

LNK1169: обнаружен многократно определенный символ - один или более - C++
Всем привет. Кто знает, из-за чего может быть такая ошибка? Main: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;Class1.h&quot; ...

Обнаружен многократно определенный символ - один или более Visual Studio - C++
Добрый день! Смотрите) Есть заголовочный файл, который по сути пустой using namespace std; class Zak { public: }; и файл cpp,...

fatal error LNK1169: обнаружен многократно определенный символ - один или более - C++
код который показан снизу я компилировал в двух программах на visual c++ и dev c++ в dev c++ всё прошло успешно но в visual c++ выдаёт...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,219
Завершенные тесты: 1
15.12.2013, 14:38 #2
В h файле их надо объявить как extern
C++
1
2
3
extern CRITICAL_SECTION SYNC_stuff;
extern bool bDraw;
extern bool bUpdate;
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
15.12.2013, 14:43  [ТС] #3
Цитата Сообщение от zss Посмотреть сообщение
В h файле их надо объявить как extern
C++
1
2
3
extern CRITICAL_SECTION SYNC_stuff;
extern bool bDraw;
extern bool bUpdate;
Попробовал, увы не помогло.
Core.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef __ClearSky
#define __ClearSky
 
 
#include <string>
#include <Windows.h>
#include <windowsx.h>
#include <fstream>
#include <gl\GL.h>
#include <strsafe.h>
 
//Синхронизирует работу потоков
extern HANDLE EventHandler;
 
//Прототипы
void DrawMarkerOnPosition(int x, int y, HWND hwnd);
BOOL WINAPI InitThreads();
void WINAPI CloseThreads();
DWORD SoundThreadEntryPoint();
void ShowMessage(int x, int y, LPWSTR text);
void ShowError();
DWORD DoTestThread();
void DrawOnDesktop();
//Тут глобальные переменные
extern CRITICAL_SECTION SYNC_stuff;
extern bool bDraw;
extern bool bUpdate;
#endif
А вот окно вывода консоли:

Кликните здесь для просмотра всего текста
1>------ Сборка начата: проект: ClearSky, Конфигурация: Debug Win32 ------
1> Core.cpp
1>c:\users\giperion & gimaliya\source\workspaces\catvsdog\clearsky\clearsky\core.cpp(94): warning C4715: WndProc: значение возвращается не при всех путях выполнения
1> SThread.cpp
1>Core.obj : error LNK2001: неразрешенный внешний символ ""void * EventHandler" (?EventHandler@@3PAXA)"
1>SThread.obj : error LNK2001: неразрешенный внешний символ ""void * EventHandler" (?EventHandler@@3PAXA)"
1>Core.obj : error LNK2001: неразрешенный внешний символ ""struct _RTL_CRITICAL_SECTION SYNC_stuff" (?SYNC_stuff@@3U_RTL_CRITICAL_SECTION@@A)"
1>SThread.obj : error LNK2001: неразрешенный внешний символ ""struct _RTL_CRITICAL_SECTION SYNC_stuff" (?SYNC_stuff@@3U_RTL_CRITICAL_SECTION@@A)"
1>Core.obj : error LNK2001: неразрешенный внешний символ ""bool bDraw" (?bDraw@@3_NA)"
1>Core.obj : error LNK2001: неразрешенный внешний символ ""bool bUpdate" (?bUpdate@@3_NA)"
1>SThread.obj : error LNK2001: неразрешенный внешний символ ""bool bUpdate" (?bUpdate@@3_NA)"
1>C:\Users\Giperion & Gimaliya\Source\Workspaces\CatVsDog\ClearSky\Debug\ClearSky.exe : fatal error LNK1120: неразрешенных внешних элементов: 4
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
zss
Модератор
Эксперт С++
6358 / 5922 / 1919
Регистрация: 18.12.2011
Сообщений: 15,219
Завершенные тесты: 1
15.12.2013, 14:52 #4
Так в одном из cpp файлов должно быть объявление без extern
C++
1
2
3
CRITICAL_SECTION SYNC_stuff;
bool bDraw;
bool bUpdate;
Префикс extern просто дает информацию компилятору о том, что где-то эта переменная существует.
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
15.12.2013, 15:29  [ТС] #5
Цитата Сообщение от zss Посмотреть сообщение
Так в одном из cpp файлов должно быть объявление без extern
C++
1
2
3
CRITICAL_SECTION SYNC_stuff;
bool bDraw;
bool bUpdate;
Префикс extern просто дает информацию компилятору о том, что где-то эта переменная существует.
Блин, как же сложно однако с глобальными переменными работать. Объявил их в core.cpp - и все заработало. Спасибо большое!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2013, 15:29
Привет! Вот еще темы с ответами:

Fatal error LNK1169: обнаружен многократно определенный символ - один или более - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;climits&gt; using std::cout; using std::cin; using std::endl; int main()...

Fatal error LNK1169: обнаружен многократно определенный символ - один или более - C++
При компиляции возникает ошибка: 1&gt;Исходный код.obj : error LNK2005: &quot;public: __thiscall Dates::~Dates(void)&quot; (??1Dates@@QAE@XZ) уже...

fatal error LNK1169: обнаружен многократно определенный символ - один или более - C++
Искала в интернете решение этой проблемы, находила похожие, но не помогло своей... В общем. Проект windows form. Есть два заголовочных...

Ошибка компоновки "LNK1169: обнаружен многократно определенный символ" - C++
Привет, народ! Уже очень долго не могу разобраться со следующей проблемой, есть 4 маленьких файла: ------------------------------- ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.12.2013, 15:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru