C++ C++;在linux上使用多个定义链接错误

C++ C++;在linux上使用多个定义链接错误,c++,linker,multiple-definition-error,C++,Linker,Multiple Definition Error,我试图编译一个代码,但它得到了多个定义的链接错误。不幸的是,我无法修复它,任何帮助都将不胜感激 我有以下文件: 头文件:CEST.h;CEST_UI.h;全局变量 源文件:CEST.cpp;CEST_UI.cpp;GlobalVariable.cpp // NOTE: usually name of any parameters is prefixed by type e.g. // I am introducing another parameter with prefix "ltDK_"

我试图编译一个代码,但它得到了多个定义的链接错误。不幸的是,我无法修复它,任何帮助都将不胜感激

我有以下文件: 头文件:CEST.h;CEST_UI.h;全局变量
源文件:CEST.cpp;CEST_UI.cpp;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};
所有声称具有多个定义的参数都在“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

必须在
.h
文件中将每个变量声明为
extern
,否则它将存在于包含
.h
的每个
.c
文件中

extern
表示链接器在另一个文件中查找变量,在您的情况下,它将在
GlobalVariables.o

另外,您需要了解
#include
.c
中插入
.h
文本,因此
.h
中的每个语句都会在每个
.c
中重复。
例如,
ltDK_TR_MTPulse_us
就是这样发生的:它在
CEST.cpp
CEST_UI.cpp
中声明,因此链接器会看到两个相同名称的变量,这是被禁止的。

包含保护防止一个源文件多次包含相同的头。它们不能防止多个定义错误。将标题中的所有定义移动到源文件,并在标题中将它们声明为
extern
。单独的源文件将包含该标题,您将得到多个定义错误。

标题中缺少一些
extern
s。这是我缺少的关键!我使用了一个“config.h”文件作为全局配置。当我开始将功能拆分成不同的文件并尝试包含config.h(即使使用extern)时,它给出了链接器错误。在将声明(extern int x;)放在.h文件中,将定义(int x=1;)放在.cpp中之后,一切正常。谢谢