Gar*_*ngh 4 c++ linker multiple-definition-error
我正在尝试编译代码,它正在获得多个定义的链接错误.不幸的是,我无法解决它,任何帮助将不胜感激.
我有以下文件:头文件: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
Run Code Online (Sandbox Code Playgroud)
我还附加了"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
Run Code Online (Sandbox Code Playgroud)
在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};
Run Code Online (Sandbox Code Playgroud)
您必须extern在.h文件中声明每个变量,否则它将存在于.c包含该文件的每个文件中.h.
extern 表示链接器在另一个文件中找到变量,在这种情况下它会找到变量 GlobalVariables.o
此外,您还需要了解#include插入文本的.h在你的.c,所以在每个语句.h重复每个.c.这是发生了什么ltDK_TR_MTPulse_us,例如:它是在这两个声明CEST.cpp和CEST_UI.cpp,因此链接器看到相同的名字,这是被禁止的两个变量.
包含防护可防止一个源文件多次包含相同的标头.它们不会阻止多个定义错误.将标头中的所有定义移动到源文件,并extern在标头中声明它们.单独的源文件将包含该标头,您将获得多个定义错误.
| 归档时间: |
|
| 查看次数: |
11754 次 |
| 最近记录: |