C ++: переопределение глобальной переменной

Когда я пытаюсь скомпилировать мой код, я получаю:

thread-support.cpp: At global scope:
thread-support.cpp:18: error: redefinition of ‘Semaphore* Mutex’
thread.h:15: error: ‘Semaphore* Mutex’ previously declared here
thread-support.cpp:19: error: redefinition of ‘Semaphore* FreePots’
thread.h:16: error: ‘Semaphore* FreePots’ previously declared here
thread-support.cpp:20: error: redefinition of ‘Semaphore* Mother’
thread.h:18: error: ‘Semaphore* Mother’ previously declared here
thread-support.cpp:21: error: redefinition of ‘Semaphore* Nap’
thread.h:20: error: ‘Semaphore* Nap’ previously declared here
thread-support.cpp:22: error: redefinition of ‘int* availPots’
thread.h:21: error: ‘int* availPots’ previously declared here
thread-support.cpp:23: error: redefinition of ‘int* emptyPots’
thread.h:22: error: ‘int* emptyPots’ previously declared here
thread-support.cpp:24: error: redefinition of ‘int* totalPots’
thread.h:24: error: ‘int* totalPots’ previously declared here

Ради пространства я просто включил мои включенные мои включенные и глобальные переменные. Если вы хотите, чтобы я опубликовал весь файл, просто дайте мне знать.

Это thread.h:

#pragma once

#include "ThreadClass.h"#include "thread-support.cpp"
extern Semaphore *Mutex;
extern Semaphore *FreePots;
extern Semaphore *Mother;
extern Semaphore *Nap;
extern int *availPots;
extern int *emptyPots;
extern int *totalPots;

Это thread.cpp:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include "thread.h"

Это поток-support.cpp

#include <iostream>
#include <string.h>
#include <stdio.h>
#include "thread.h"
Semaphore *Mutex;
Semaphore *FreePots;
Semaphore *Mother;
Semaphore *Nap;
int *availPots;
int *emptyPots;
int *totalPots;

Это thread-main.cpp:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "thread.h"

Вот мой make-файл:

CC       = c++
FLAGS    =
CFLAGS   = -g -O2
DFLAGS   = -DPACKAGE=\"threadsystem\" -DVERSION=\"1.0\" -DPTHREAD=1 -DUNIX_MSG_Q=1 -DSTDC_HEADERS=1
IFLAGS   = -I/local/eit-linux/apps/ThreadMentor/include
TMLIB    = /local/eit-linux/apps/ThreadMentor/Visual/libthreadclass.a
TMLIB_NV    = /local/eit-linux/apps/ThreadMentor/NoVisual/libthreadclass.a

OBJ_FILE = thread.o thread-support.o thread-main.o
EXE_FILE = prog4

${EXE_FILE}: ${OBJ_FILE}
${CC} ${FLAGS}  -o ${EXE_FILE}  ${OBJ_FILE} ${TMLIB_NV} -lpthread

thread.o: thread.cpp
${CC} ${DFLAGS} ${IFLAGS} ${CFLAGS} -c thread.cpp

thread-support.o: thread-support.cpp
${CC} ${DFLAGS} ${IFLAGS} ${CFLAGS} -c thread-support.cpp

thread-main.o: thread-main.cpp
${CC} ${DFLAGS} ${IFLAGS} ${CFLAGS} -c thread-main.cpp

Visual: ${OBJ_FILE}
${CC} ${FLAGS}  -o ${EXE_FILE}  ${OBJ_FILE} ${TMLIB} -lpthread

clean:
rm -f ${OBJ_FILE} ${EXE_FILE}

Я перепробовал все, что мог придумать, чтобы решить эту проблему, но у меня проблемы с поиском ответа на этот вопрос от Google. Я новичок в C ++, но я думал, что #pragma once было то, что мне было нужно.

1

Решение

У тебя есть

#include "thread-support.cpp"

в заголовок thread.h, что вызывает проблему. Не включайте это, но компилируйте это отдельно и связывайте это. (Что уже сделано правильно с помощью Makefile, так что просто удалите include из заголовка)

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]