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

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

Восстановить пароль Регистрация
 
Giperion
1 / 1 / 1
Регистрация: 14.12.2013
Сообщений: 12
15.12.2013, 14:34     Многократно объявленый символ #1
Здравствуй 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     Многократно объявленый символ
Посмотрите здесь:

fatal error LNK1169: обнаружен многократно определенный символ - один или более C++
fatal error LNK1169: обнаружен многократно определенный символ - один или более C++
C++ Многократно определенный символ. Где?
Ошибка компоновки "LNK1169: обнаружен многократно определенный символ" C++
Fatal error LNK1169: обнаружен многократно определенный символ - один или более C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 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 - и все заработало. Спасибо большое!
Yandex
Объявления
15.12.2013, 15:29     Многократно объявленый символ
Ответ Создать тему
Опции темы

Текущее время: 05:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru