尝试使用另一个类中的变量时出现 C++ 链接器错误

C++ Linker error when trying to use variable from another class

提问人:oodan123 提问时间:7/24/2015 更新时间:7/24/2015 访问量:158

问:

我对 c++ 很陌生,这个错误一直在困扰我。基本上,我有一个名为 PvSimpleUISampleDlg 的类,它是一个显示和连接 FLIR 热像仪的 GUI。在 DoDataExchange 方法中,我有一行将 IDC_IP_EDIT 与类中其他位置使用的 mIPEdit 链接起来。

//PvSimpleUISampleDlg.cpp
void PvSimpleUISampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_IP_EDIT, mIPEdit);
}

我创建了一个名为 SettingsDlg 的新对话框类,当我单击 PvSimpleUISampleDlg 类中的按钮时,该类将打开,并且我想在该对话框中使用相同的 mIPEdit 变量,以便 GUI 的每个部分中的数据都相同。因此,我进入了 PvSimpleUISampleDlg.h 文件,并将 extern 放在 mIPEdit 减速的前面,以便其他类可以看到它。

//PvSimpleUISampleDlg.h
extern CEdit mIPEdit;

现在,在 SettingsDlg.cpp 文件中,我将同一行放入其自己的 DoDataExchange 方法中,并且确信它识别了 mIPEdit 变量。

//SettingsDlg.cpp
void SettingsDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_IP_EDIT, mIPEdit);
}

但是,当我现在构建解决方案时,出现错误

1>PvSimpleUISampleDlg.obj : error LNK2001: unresolved external symbol "class CEdit mIPEdit" (?mIPEdit@@3VCEdit@@A)
1>SettingsDlg.obj : error LNK2001: unresolved external symbol "class CEdit mIPEdit" (?mIPEdit@@3VCEdit@@A)
1>D:\FLIR Project\FLIR Project\PvSimpleUISample\Debug\PvSimpleUISample_Dbg.exe : fatal error LNK1120: 1 unresolved externals

我已将 PvSimpleUISampleDlg.h 文件包含在 SettingsDlg.cpp 和 SettingsDlg.h 文件中,我所做的只是复制一行。我读过很多问类似问题的问题,但我仍然不明白,因为答案是“您需要将其链接到两个项目”或“您需要在项目中包含库”我已经将两个 SettingsDlg 文件添加到项目中,我只使用一个项目。所有适当的库都应该链接到项目,因为解决方案构建良好,只有在我添加该行时才会出现错误。任何帮助/建议将不胜感激。

C++ Visual-Studio-2010 MFC 链接器错误 外部

评论

0赞 Blacktempel 7/24/2015
你在哪里声明了那个变量?mIPEdit
0赞 rrirower 7/24/2015
我想在该对话框中使用相同的 mIPEdit 变量,以便 GUI 的每个部分中的数据都相同。- 您无需重复使用该变量即可完成此操作。事实上,你可能不应该这样做。
0赞 IInspectable 7/24/2015
尝试同时学习 C++、MFC 和 Windows API 几乎不可能成功结束(您的问题历史记录表明进展甚微)。C++本身就足够具有挑战性。如果您想拥有 GUI,要么学习 C++(通过基于命令行的应用程序),要么使用 C(和一点点 C++)和 Windows API。不要使用 MFC,除非您精通 C++ 或 Windows API(理想情况下两者都精通)。
0赞 ScottMcP-MVP 7/24/2015
SettigsDlg 中的 DDX_Control 语句仅对属于对话框的控件有效。从你所说的话来看,我不认为对话具有IDC_IP_EDIT控制权。

答:

0赞 Wang Wei 7/24/2015 #1

据我了解,

 extern CEdit mIPEdit; 

这是一个宣言,而不是一个定义。 您仍然必须在某个 .cpp 文件中的某个地方拥有它的定义。必须编译该 .cpp 文件,并将其链接到使用该声明的两个 .cpp 文件的目标文件。某些.cpp中的相应定义如下所示:

CEdit mIPEdit;

评论

0赞 oodan123 7/24/2015
所以最初在我拥有的 .h 文件中,当我添加 extern 时,我不得不将其移出类。你是说我两者都需要吗?因为我试图两者兼而有之,但它仍然给出了错误CEdit mIPEditCEdit mIPEditextern CEdit mIPEdit
0赞 Wang Wei 7/25/2015
在全局范围内使用是使此变量静态存储和全局可见性。我认为在两个 .cpp 文件中包含包含此行的标头将显示“多个定义”的错误,因为包含它的每个 .cpp 都会在其对象文件中生成一个定义。将其更改为也不起作用,因为编译器接受“ok its extern so I will resolve at link time”,但一个 .cpp 文件中只需要有一个定义来编译出所需的符号。您可以尝试在标头中使用“extern”,然后在一个 cpp 中使用 non-extern。CEdit mIPEditextern