none
书本上的一个例子,然后编译出现了问题,求指教,谢谢 RRS feed

  • 问题

  • 编译的情况如下所示:

    1>------ 已启动生成: 项目: Button, 配置: Debug Win32 ------
    1>正在编译...
    1>stdafx.cpp
    1>正在编译...
    1>Button.cpp
    1>MainFrm.cpp
    1>ButtonDoc.cpp
    1>ButtonView.cpp
    1>ButtonDlg.cpp
    1>正在生成代码...
    1>正在编译资源...
    1>正在编译资源清单...
    1>正在链接...
    1>Button.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall CDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAE_NXZ)
    1>ButtonDlg.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall CDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAE_NXZ)
    1>D:\My Documents\Visual Studio 2005\Projects\Button\Debug\Button.exe : fatal error LNK1120: 1 个无法解析的外部命令
    1>生成日志保存在“file://d:\My Documents\Visual Studio 2005\Projects\Button\Button\Debug\BuildLog.htm”
    1>Button - 3 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

    不太懂………………

    2015年9月20日 9:59

答案

  • 源代码中的父类应该就是virtual BOOL OnInitDialog();可能是你无意间改了源码。你可以把父类的改回去试试,都改成BOOL。 如果这样不行的话,可能你的库文件有问题,你可以卸载它并安装VS2015。
    • 已建议为答案 chchlll 2015年9月21日 12:24
    • 已标记为答案 乐逍遥1a 2015年9月22日 2:58
    2015年9月21日 11:49

全部回复

  •  

    你好,

           如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
        这种错误有很多情况导致,比较常见的情况是:
    1. 缺少对OnInitDialog函数的函数体定义
        查看此函数体是否被定义。
    2.  错误的返回值类型
        这里有一个类似的帖子也出现了这样的错误,正确的做法是将bool改为BOOL。你可以查看是否属于这种情况,如果是的话可以依此方法改正:CDialog::OnInitDialog(void) problem (MFC) https://social.msdn.microsoft.com/Forums/vstudio/en-US/2ceffceb-d62e-4570-87db-81f39e26850b/cdialogoninitdialogvoid-problem-mfc?forum=vcgeneral
        如果上述两种设置都是正确的,那可能存在别的问题,你能提供代码例子或者能重现问题的部分代码吗?这样我能更准确的确定你的问题。

     

     

     


    • 已编辑 chchlll 2015年9月21日 7:35
    2015年9月21日 7:23
  • 谢谢你详细的回答!我重新看了一次那几个出现此类问题的文件,对照书本之后发现我错了关键一步:我在创建项目的时候用的是单文档的MFC程序但是书本写的是“基于对话框”的MFC程序。所以,这个问题解决了。

    但是,又有一个新问题……这个案例我复述给你听:

    (1)新建一个基于对话框的应用程序项目(MFC),命名为Button1.

    (2)删除对话框上自带的“确定”和“取消”按钮以及静态文本框

    (3)添加一个按钮和编辑框控件。将Button按钮拖动到对话框,修改它的Caption为“叮咚按钮”。将Edit Control拖到对话框。

    (4)给按钮添加消息处理函数:双击“叮咚按钮”在OnBnClickedButton1()函数中添加如下代码:

    void CButtonDlg::OnBnClickedButton1()

    {

    SetDlgItemText(IDC_EDIT1,_T("按钮功能实现了"));

    }

    (5)调试程序,单击“叮咚按钮”。【最终效果是编辑框控件会显示那一行中文输出。】

    1>------ 已启动生成: 项目: Button1, 配置: Debug Win32 ------
    1>正在编译...
    1>stdafx.cpp
    1>正在编译...
    1>Button1.cpp
    1>d:\my documents\visual studio 2005\projects\button1\button1\button1dlg.h(33) : error C2555: “CButton1Dlg::OnInitDialog”: 重写虚函数返回类型有差异,且不是来自“CDialog::OnInitDialog”的协变
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2903) : 参见“CDialog::OnInitDialog”的声明
    1>Button1Dlg.cpp
    1>d:\my documents\visual studio 2005\projects\button1\button1\button1dlg.h(33) : error C2555: “CButton1Dlg::OnInitDialog”: 重写虚函数返回类型有差异,且不是来自“CDialog::OnInitDialog”的协变
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2903) : 参见“CDialog::OnInitDialog”的声明
    1>正在生成代码...
    1>生成日志保存在“file://d:\My Documents\Visual Studio 2005\Projects\Button1\Button1\Debug\BuildLog.htm”
    1>Button1 - 2 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

    这个程序很简单,我应该没有做错,但是结果却不行。

    2015年9月21日 8:22
  • 你好,我根据你的步骤运行了程序,但是是没有问题的。

    1. 这里的类名应该是CButton1Dlg而不是CButtonDlg,可能是你的输入错误。

    2. 根据这个错误信息,可能是CButton1Dlg::OnInitDialog()这个函数的返回类型的问题。你可以查看一下CButton1Dlg中定义OnInitDialog()的返回类型,然后根据父类的返回类型修改子类的返回类型(即此处的返回类型)。通过右击CButton1Dlg 弹出右键菜单,选择go to definition(查看定义)就可以看到父类的定义。


    • 已编辑 chchlll 2015年9月21日 9:59
    2015年9月21日 9:55
  • (1)你提到的第一点,其实我这边在电脑上的编写是对的,只是我写给你的时候按照书本写了,所以漏掉了那个“1”

    (2)你提到的第二点,我去看了一下,确实是不一样的。很奇怪的是,这好像是系统自动生成的,我并没有对它进行操作。

    在父类里面是virtual bool OnInitDialog();但是我的子类却成了BOOL。

    (3)针对(2),我把子类改成了bool,但是编译之后出现了下面的语句:

    1>------ 已启动生成: 项目: Button1, 配置: Debug Win32 ------
    1>正在编译...
    1>Button1Dlg.cpp
    1>正在链接...
    1>Button1Dlg.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall CDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAE_NXZ)
    1>D:\My Documents\Visual Studio 2005\Projects\Button1\Debug\Button1.exe : fatal error LNK1120: 1 个无法解析的外部命令
    1>生成日志保存在“file://d:\My Documents\Visual Studio 2005\Projects\Button1\Button1\Debug\BuildLog.htm”
    1>Button1 - 2 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

    2015年9月21日 11:23
  • 源代码中的父类应该就是virtual BOOL OnInitDialog();可能是你无意间改了源码。你可以把父类的改回去试试,都改成BOOL。 如果这样不行的话,可能你的库文件有问题,你可以卸载它并安装VS2015。
    • 已建议为答案 chchlll 2015年9月21日 12:24
    • 已标记为答案 乐逍遥1a 2015年9月22日 2:58
    2015年9月21日 11:49
  • 谢谢你,能运行了!谢谢!
    2015年9月21日 12:17
  • 改成BOOL就可以了,谢谢!
    2015年9月21日 12:17