C++ 链接错误与 linux 上的多个定义

标签 c++ linker multiple-definition-error

我正在尝试编译一段代码,但出现了多个定义的链接错误。不幸的是,我无法修复它,我们将不胜感激。

我有以下文件: 头文件:CEST.h; CEST_UI.h;全局变量.h;
源文件:CEST.cpp; CEST_UI.cpp;全局变量.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”,你可以看看。

在“全局变量.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};

最佳答案

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

extern意味着链接器在另一个文件中找到变量,在你的情况下它会在 GlobalVariables.o 中找到变量

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

关于C++ 链接错误与 linux 上的多个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18763270/

相关文章:

c++ - 从 C/C++ 中的 .csv 文件中读取汉字

c++ - 具有固定值枚举器的枚举的零初始化

c - 虚拟内存和可重定位代码

C++:通过引用传递(指向?)对象数组

c++ - C/C++ 的脚本语言?

使用链接器命令文件输入到链接器来有条件地链接程序中的部分?

c++ - 从 .cpp 文件调用 .mm 函数的链接器错误

c++ - 命名空间函数的多重定义

无法重新定义枚举类型定义

c++ - 使用在同一命名空间中定义的构造函数实例化命名空间中的对象。 C++