C++ Linux 上具有多个定义的链接错误
C++ linking error with multiple definition on linux
我正在尝试编译代码,但出现具有多个定义的链接错误。不幸的是,我无法修复它,任何帮助将不胜感激。
我有以下文件:头文件: CEST.h; CEST_UI; 全局变量.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",以便您可以查看。
在"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
在全局变量中.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};
您必须将每个变量声明为 .h
文件中的extern
,否则它将存在于包含 .h
的每个.c
文件中。
extern
意味着链接器在另一个文件中查找变量,在本例中,它将在 GlobalVariables.o
另外,您需要了解#include
.c
中插入.h
的文本,因此.h
中的每个语句在每个.c
中都是重复的。例如,这就是发生在ltDK_TR_MTPulse_us
上的情况:它在CEST.cpp
和CEST_UI.cpp
中都声明,因此链接器看到两个同名的变量,这是被禁止的。
包含保护可防止一个源文件多次包含同一标头。它们不能防止多个定义错误。将标头中的所有定义移动到源文件,并将它们声明为标头中的extern
。单独的源文件将包含该标头,并且您将收到多个定义错误。
相关文章:
- g++用户定义的动态链接库上的全局new和delete运算符
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 链接 cmake 时出现未定义的引用错误
- 链接阶段出现多重定义错误
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- C++链接时间资源"allocation"而不定义
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 使用标头保护的多个定义链接错误
- C++不使用"inline"或"static"无类函数的关键字时出现重定义链接错误
- 从自定义链接列表中打印值时,循环陷入无限时
- OpenCV源与CUDA编译生成多个定义链接错误
- 在源文件中定义链接选项C++
- 如果两个静态库包含 pugixml objs,如何避免与 pugixml 的“已定义”链接错误
- 已定义链接器错误
- 来自优化级别的C++多定义链接器错误
- 多重定义:链接时出现错误
- c++多定义链接错误与.h中声明的const
- 使用自定义链接标志构建poco库
- 异步事件:已定义链接器错误[Windows Update API]
- CMake AMRCC + 自定义链接器