为了建立全局变量,照着网上的方法建立了一个PublicUse类实现全局变量~~结果就出了这种连接错误~~1>KeyboardDlg.obj : error LNK2001: 无法解析的外部符号 "public: void __thiscall CKeyboardDlg::OnEnChangeEdit1(void)" (?OnEnChangeEdit1@CKeyboardDlg@@QAEXXZ)
1>KeyboardDlg.obj : error LNK2001: 无法解析的外部符号 "public: static int PublicUse::getrow" (?getrow@PublicUse@@2HA)
1>KeyboardDlg.obj : error LNK2001: 无法解析的外部符号 "public: static int PublicUse::getline" (?getline@PublicUse@@2HA)
1>KeyboardDlg.obj : error LNK2001: 无法解析的外部符号 "public: static int (* PublicUse::A)[4]" (?A@PublicUse@@2PAY03HA)
1>PublicUse.obj : error LNK2001: 无法解析的外部符号 "public: static int (* PublicUse::A)[4]" (?A@PublicUse@@2PAY03HA)
1>C:\Users\acer\Documents\Visual Studio 2010\Projects\Keyboard\Debug\Keyboard.exe : fatal error LNK1120: 4 个无法解析的外部命令

解决方案 »

  1.   

    PublicUse.h#pragma once// PublicUseclass PublicUse : public CWinApp
    {
    DECLARE_DYNCREATE(PublicUse)protected:
    PublicUse();           // 动态创建所使用的受保护的构造函数
    virtual ~PublicUse();public:
    virtual BOOL InitInstance();
    virtual int ExitInstance();
    static int Line[4];
        static int A[4][4];
    static int Row;
        static char ASC[4][4];
    static int  *p[4];
    static int getline;
    static int getrow;
    protected:
    DECLARE_MESSAGE_MAP()
    };
      

  2.   

    PublicUse.cpp
    / PublicUse.cpp : 实现文件
    //#include "stdafx.h"
    #include "Keyboard.h"
    #include "PublicUse.h"
    // PublicUseIMPLEMENT_DYNCREATE(PublicUse, CWinApp)PublicUse::PublicUse()
    {
    }PublicUse::~PublicUse()
    {
    }BOOL PublicUse::InitInstance()
    {
    // TODO: 在此执行任意逐线程初始化
    return TRUE;
    }int PublicUse::ExitInstance()
    {
    // TODO: 在此执行任意逐线程清理
    return CWinApp::ExitInstance();
    }BEGIN_MESSAGE_MAP(PublicUse, CWinApp)
    END_MESSAGE_MAP()
    // PublicUse 消息处理程序
    int *PublicUse::p[4]={ PublicUse::A[0],PublicUse::A[1], PublicUse::A[2], PublicUse::A[3]};
    int PublicUse::Line[4]={1,1,1,1};
    int PublicUse::Row=0;
    char  PublicUse::ASC[4][4]={'1','2','3','4','5','6','7','8','A','B','C','D','E','F','G','H'};
      

  3.   

    // KeyboardDlg.cpp : 实现文件#include "stdafx.h"
    #include "Keyboard.h"
    #include "KeyboardDlg.h"
    #include "afxdialogex.h"
    #define NoneInput 100#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    void InitMatrix(int **X,int n){
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    X[i][j]=0;
    }void InitL(int L[],int k,int n){
       
    for(int i=0;i<n;i++) L[i]=1;
          
        L[k]=0;}
    int IfOut0(int **X,int p,int n,int L[]){
    for(int j=0;j<n;j++)
    if(!L[p]&&X[p][j]) {
    PublicUse::Row=j;
    return 1;}
    return 0;
    }
    int Scan(int **X,int L[],int n){
    for(int i=0;i<n;i++){
    i=i%4;
    InitL(L,i,4);
    if(IfOut0(X,i,n,L)) return i;
    }
    return NoneInput;
    }
    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
    {
    public:
    CAboutDlg();// 对话框数据
    enum { IDD = IDD_ABOUTBOX }; protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    // CKeyboardDlg 对话框
    CKeyboardDlg::CKeyboardDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CKeyboardDlg::IDD, pParent)
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    }void CKeyboardDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    }
    BEGIN_MESSAGE_MAP(CKeyboardDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON() ON_BN_CLICKED(B1, &CKeyboardDlg::OnBnClickedB1)
    ON_BN_CLICKED(B2, &CKeyboardDlg::OnBnClickedB2)
    ON_BN_CLICKED(B4, &CKeyboardDlg::OnBnClickedB4)
    ON_STN_CLICKED(Txt, &CKeyboardDlg::OnStnClickedTxt)
    ON_BN_CLICKED(B3, &CKeyboardDlg::OnBnClickedB3)
    ON_BN_CLICKED(B8, &CKeyboardDlg::OnBnClickedB8)
    ON_BN_CLICKED(B5, &CKeyboardDlg::OnBnClickedB5)
    ON_BN_CLICKED(B6, &CKeyboardDlg::OnBnClickedB6)
    ON_BN_CLICKED(B7, &CKeyboardDlg::OnBnClickedB7)
    ON_BN_CLICKED(B9, &CKeyboardDlg::OnBnClickedB9)
    ON_BN_CLICKED(B10, &CKeyboardDlg::OnBnClickedB10)
    ON_BN_CLICKED(B11, &CKeyboardDlg::OnBnClickedB11)
    ON_BN_CLICKED(B12, &CKeyboardDlg::OnBnClickedB12)
    ON_BN_CLICKED(B13, &CKeyboardDlg::OnBnClickedB13)
    ON_BN_CLICKED(B14, &CKeyboardDlg::OnBnClickedB14)
    ON_BN_CLICKED(B15, &CKeyboardDlg::OnBnClickedB15)
    ON_BN_CLICKED(B16, &CKeyboardDlg::OnBnClickedB16)
    ON_STN_CLICKED(OutPut, &CKeyboardDlg::OnStnClickedOutput)
    ON_EN_CHANGE(IDC_EDIT1, &CKeyboardDlg::OnEnChangeEdit1)
    END_MESSAGE_MAP()
    // CKeyboardDlg 消息处理程序BOOL CKeyboardDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
    BOOL bNameValid;
    CString strAboutMenu;
    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    ASSERT(bNameValid);
    if (!strAboutMenu.IsEmpty())
    {
    pSysMenu->AppendMenu(MF_SEPARATOR);
    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    }
    } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码



    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }void CKeyboardDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
    }
    else
    {
    CDialogEx::OnSysCommand(nID, lParam);
    }
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CKeyboardDlg::OnPaint()
    {
    if (IsIconic())
    {


    }
    else
    {   CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.FillSolidRect(&rect,RGB(0x55,0x6B,0x2F));
    dc.DrawIcon(x, y, m_hIcon);
    CDialogEx::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CKeyboardDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }
    void CKeyboardDlg::OnBnClickedB1()
    {
    // TODO: 在此添加控件通知处理程序代码

    InitMatrix( PublicUse::p,4);
    PublicUse::A[0][0]=1;
        PublicUse::getline=Scan( PublicUse::p, PublicUse::Line,4);
    PublicUse::getrow= PublicUse::Row;
    }
    void CKeyboardDlg::OnBnClickedB2()
    { // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB3()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB4()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB5()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB6()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB7()
    {
    // TODO: 在此添加控件通知处理程序代码
    }void CKeyboardDlg::OnBnClickedB8()
    {
    // TODO: 在此添加控件通知处理程序代码
    }void CKeyboardDlg::OnBnClickedB9()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB10()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB11()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB12()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB13()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB14()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB15()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnBnClickedB16()
    {
    // TODO: 在此添加控件通知处理程序代码
    }void CKeyboardDlg::OnStnClickedTxt()
    {
    // TODO: 在此添加控件通知处理程序代码
    }
    void CKeyboardDlg::OnStnClickedOutput()
    {
    // TODO: 在此添加控件通知处理程序代码
       
    }
     
      

  4.   

    链接错误一般主要是lib文件或者DLL文件没有匹配上检查VC++ Directory中是否已经把lib文件引入
      

  5.   

    象这样的函数: void __thiscall CKeyboardDlg::OnEnChangeEdit1(void)
    你在KeyboardDl.cpp里删了,但在KeyboardDl.h头文件里没有删除它的声明会出现“无法解析的外部符号”这种错误。
    再就是楼上说的,没有引入lib或DLL库文件。