linker — ошибка компоновки C ++ с множественным определением в linux

Я пытаюсь скомпилировать код и получаю ошибку компоновки с несколькими определениями. К сожалению, я не могу это исправить, и любая помощь будет оценена.

У меня есть следующие файлы:
Заголовочные файлы: CEST.h; CEST_UI.h; GlobalVariable.h;
Исходный файл: CEST.cpp; CEST_UI.cpp; GlobalVariable.cpp

Все параметры, которые, как утверждается, имеют несколько определений, определены в «GlobalVariable.h» и инициализированы в «GlobalVariable.cpp».

Я включаю «GlobalVariable.h» дважды: один раз в CEST.cpp и второй раз в CEST_UI.cpp.

Я думал, что следующая защита в «GlobalVariable.h» защитит меня от ошибки связывания нескольких определений:

# ifndef GLOBALVARIABLE_H
#define GLOBALVARIABLE_H
………….
………….
#endif

Я также прилагаю «GlobalVariable.h» и «GlobalVariable.cpp», чтобы вы могли посмотреть.

В «GlobalVariable.h»

# ifndef GLOBALVARIABLE_H
#define GLOBALVARIABLE_H

#include <vector>
////////////////////////////////////////
extern long lFA_MTPulse;
extern long lNoOfMTPulses;
extern long ltDK_MTPulse_Duration_us;
//extern long ltDK_MTPulse_Delay_us;
extern long ltDK_Wait_After_MT_us;
extern long ltDK_Wait_After_MTSpoil_us;
extern long lNoOfMTPulses_PerRTEB;
extern long ltDK_PreAcqCESTPulseTime_ms;
extern long ltDK_PreAcqCESTPulseTime_us;
extern long lTest_XgradStrength;
//double TR_MTPulse_Remain = 0.0;                                                                   // CEST This will be calculated later
long ltDK_TR_MTPulse_us;
long ltDK_TimeNeeded_for_sMTCSpoilerOnly;
long ltDK_MTBlockTime_DK;

////////////////////////////////////////
extern double dBWTimeProd;
extern double dSpoilerCTRL;
extern double dOffResonance_Rel;
////////////////////////////////////////
long No_of_Samples = (long)512;                                                                     // CEST
long lNo_of_MTPulses_PreAcq;
//static sRF_PULSE  sRfMSat1("sRfMSat");                                                        // CEST("sRfMSat")

extern long lNoOfKSpaceAcq_PerCEST_ArrayValues[];#endif

В GlobalVariable.cpp

// NOTE: usually name of any parameters is prefixed by type e.g.
// I am introducing another parameter with prefix "ltDK_" for "long-time" parameter
//
long lFA_MTPulse = 100;
long lNoOfMTPulses = 1;
long ltDK_MTPulse_Duration_us = 10000;
//long ltDK_MTPulse_Delay_us = 10000;
long ltDK_Wait_After_MT_us = 0;
long ltDK_Wait_After_MTSpoil_us = 0;
long ltDK_PreAcqCESTPulseTime_ms = 3500;                                                // in micro sec
long ltDK_PreAcqCESTPulseTime_us = (long)((double)ltDK_PreAcqCESTPulseTime_ms*1000);    // in milli sec
long lTest_XgradStrength = 0;

long lNoOfMTPulses_PerRTEB = 30;
double dBWTimeProd = 1.79;
double dSpoilerCTRL = 1.0;
double dOffResonance_Rel = 0.0;
long lNoOfKSpaceAcq_PerCEST_ArrayValues[5] = {1, 3, 5, 7, 9};

4

Решение

Вы должны объявить каждую переменную как extern в .h файл, иначе он будет существовать в каждом .c файл, который включает в себя .h,

extern означает, что компоновщик найдет переменные в другом файле, в вашем случае он найдет переменные в GlobalVariables.o

Кроме того, вы должны понимать, что #include вставить текст из .h в вашем .cпоэтому каждое утверждение в .h повторяется в каждом .c,
Это то, что происходит с ltDK_TR_MTPulse_us например: он объявлен в обоих CEST.cpp а также CEST_UI.cppТаким образом, компоновщик видит две переменные с одинаковыми именами, что запрещено.

7

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

Защитные ограждения не позволяют одному исходному файлу включать один и тот же заголовок более одного раза. Oни не делайте предотвратить множественные ошибки определения. Переместите все ваши определения в заголовке в исходный файл и объявите их как extern в шапке. Отдельные исходные файлы будут включать этот заголовок, и вы получите несколько ошибок определения.

6

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