【问题标题】:one or more multiply defined symbols found error in winform vc++ application在 winform vc++ 应用程序中发现一个或多个多重定义符号错误
【发布时间】:2012-07-17 13:06:09
【问题描述】:

我正在使用 VC++ 中的表单应用程序。我有主窗体,即 Form1.h 以及名为 child.h 的子窗体。我在 form1.h 的按钮单击上调用 child.h 表单。为了调用 child.h,我必须在 Form1.h 中包含 Child.h。

我使用了以下代码 在 Form1.h

    #incude "Child.h"

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
     Child^ c=gcnew Child;
     c->Visible=true;
}

在 Child.h 中,我正在做一些处理。为此,我制作了一个名为 param.h 的头文件,其中包含一些函数名和全局变量名。我在 Child.h 文件中包含了 param.h。

而 param.h 是

#ifndef param_h_seen
#define param_h_seen
#define LED_Line 4
#define CALIBRATION_MODE 0
typedef unsigned __int32 uint32_t;
typedef unsigned __int8 uint8_t;

/****for LED ROI entered by user***/
int x_of_roi=6;
int y_of_roi=10;
/********************************/

/*************for graph ROI*******/
int ROIwidth=16;
int ROIheight=4096;

/********************************/
int LED_num= 64;
unsigned short *calib_factor;
/*********functions*****************/

int find_area(unsigned char *intensity,int start);

void DetectRectangle();
/***************************************/


#endif

包含 child.h 后显示错误

PUMA_LED_TESTER.obj : error LNK2005: "unsigned short * calib_factor" (?calib_factor@@3PAGA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int x_of_roi" (?x_of_roi@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int y_of_roi" (?y_of_roi@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int ROIwidth" (?ROIwidth@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int ROIheight" (?ROIheight@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int LED_num" (?LED_num@@3HA) already defined in Child.obj

我不知道为什么会出现这些错误。任何人都可以告诉我解决这些错误的解决方案

提前致谢

【问题讨论】:

标签: c++ multiple-definition-error


【解决方案1】:
int x_of_roi=6;
int y_of_roi=10;

这些是定义,不应在您的头文件中。将它们放在其中一个 cpp 文件中,并且在标题上有:

extern int x_of_roi
extern int y_of_roi;

您在头文件中声明的其余全局变量也是如此。当这些头文件包含在多个 cpp 文件(即翻译单元)中时,每个单元都会有效地声明具有相同名称的新变量,链接器会抱怨这一点。

【讨论】:

  • 感谢您的回复...感谢您的回答。我也想过外部变量,但不是那样..
【解决方案2】:

每次将标题#include 插入源文件时,结果与复制/粘贴标题文本相同。所以,如果你有一个定义了某些东西的标题:

header.h:
int magic = 0xA0B1C2D3

然后你将它包含在多个 cpp 文件中:

source1.cpp:
#include "header.h"
<...>

source2.cpp:
#include "header.h"
<...>

结果是为每个 cpp 定义了变量和宏。在这种情况下,没关系。但是,如果您有更复杂的依赖关系,这可能会导致您当前遇到的错误。

在您的情况下,您基本上包含两次相同的文件,这会导致具有相同名称的东西的多重定义。您需要做的是将定义放在头文件之外,并在需要从其他地方访问它们时使用extern

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多