5

コードをコンパイルしようとしていますが、複数の定義でリンク エラーが発生します。残念ながら、私はそれを修正することができません。助けていただければ幸いです。

次のファイルがあります。ヘッダー ファイル: CEST.h; CEST_UI.h; GlobalVariable.h;
ソース ファイル: CEST.cpp; CEST_UI.cpp; グローバル変数.cpp

複数の定義があると主張されているすべてのパラメーターは、「GlobalVariable.h」で定義され、「GlobalVariable.cpp」で初期化されます。

「GlobalVariable.h」を 2 回含めています。1 回目は CEST.cpp に、2 回目は CEST_UI.cpp に含めています。

「GlobalVariable.h」の次のガードは、複数の定義のリンクエラーから私を保護するだろうと考えていました:

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

「GlobalVariable.h」と「GlobalVariable.cpp」も添付しますので、ご覧ください。

「GlobalVariable.h」内</p>

# 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

2 に答える 2

8

externファイル内のようにすべての変数を宣言する必要があり.hます。そうしないと.c.h.

externリンカーが別のファイルで変数を見つけることを意味します。あなたの場合、変数はGlobalVariables.o

また、 のテキストを に挿入#includeすることを理解する必要があるため、 の各ステートメントは各 で繰り返されます。これは、たとえば、との両方で宣言されているため、リンカは禁止されている同じ名前の 2 つの変数を認識します。.h.c.h.cltDK_TR_MTPulse_usCEST.cppCEST_UI.cpp

于 2013-09-12T11:44:27.527 に答える
8

インクルード ガードは、1 つのソース ファイルが同じヘッダーを複数回インクルードするのを防ぎます。複数の定義エラーを防ぐことはできません。ヘッダー内のすべての定義をソース ファイルに移動し、それらをヘッダー内で宣言しますextern。別のソース ファイルにはそのヘッダーが含まれ、複数の定義エラーが発生します。

于 2013-09-12T11:44:42.697 に答える