未解决的外部错误C ++项目中的错误

时间:2011-05-16 10:09:50

标签: c++

我使用简单的编辑器编写了我的项目,并通过命令行界面使用Microsoft vc ++编译器编译它们,我收到以下错误:

/out:Main.exe Main.obj
  

Main.obj:错误LNK2019:未解决   外部符号“public:void   __thiscall Ac count :: debit(int)“(?debit @ Account @@ QAEXH @ Z)引用   在函数_main

中      

Main.obj:错误LNK2019:未解决   外部符号“public:int   __thiscall Acc ount :: getBalance(void)“(?getBalance @ Account @@ QAEHXZ)   在函数_main

中引用      

Main.obj:错误LNK2019:未解决   外部符号“public:__ thiscall   Account :: Account(int)“   (?? 0Account @@ QAE @ H @ Z)参考   function _main Main.exe:致命错误   LNK1120:3个未解析的外部

以下是代码:

//File : Account.h
class Account{
    public:
        Account( int );
        void credit( int );
        void debit( int );
        int getBalance();
    private:
        int balance;
};
//File:Account.cpp

#include<iostream>
using std::cout;
using std::endl;

#include "Account.h"

Account::Account( int initialbalance ){
    balance = 0;

    if( initialbalance > 0 )
        balance = initialbalance;

    if ( initialbalance < 0 )
        cout<<"Initial Balance is empty\n"<<endl;
}

void Account::credit( int amount ){
        balance = balance + amount;
}

void Account::debit( int amount ){
        if( amount <= balance )
            balance = balance - amount;
        else
            cout<<"Debit amount exceed balance amount\n"<<endl;
}

int Account::getBalance(){
        return balance;
}   
//File : Main.cpp
#include<iostream>
using std::cout;
using std::endl;
using std::cin;

#include "Account.h"

int main(){
    Account obj(50);

    cout<<"Account balance Rs. "<<obj.getBalance()<<"\n"<<endl;
    int withdraw;

    cout<<"Withdrawal amount for your account\n"<<endl;
    cin>>withdraw;

    cout<<"Withdrawing ....."<<endl;
    obj.debit( withdraw );

    cout<<"Final account balance : "<<obj.getBalance()<<endl;


    return 0;
}   

我首先使用“cl / LD Account.cpp”编译Account.cpp,然后当我尝试编译“Main.cpp”时,我得到这些错误,具体我想知道如何使用编译。我的客户端代码中的dll或.obj文件,当它们的源代码不可用时使用这些编译文件。

提前致谢。

4 个答案:

答案 0 :(得分:4)

它看起来只是从 Main.obj 创建 Main.exe ;你也应该链接 Account.obj

答案 1 :(得分:1)

您似乎没有 Account.obj链接到Main.exe。你命名为Main.obj,但不是Account.obj。

答案 2 :(得分:1)

显然您忘记在命令行参数中包含Account.obj/out:Main.exe Main.obj Account.obj

答案 3 :(得分:0)

假设您已将 Account.cpp 编译到 Account.dll 中,编译器应该已生成导入库 Account.lib 。然后你的链接指令应该是:

/out:Main.exe Main.obj Account.lib

通常,在编译期间,类或函数的具体实现不是必需的 - 只是声明,因此编译器应该知道将哪些“占位符”放在中间文件中,例如 .obj 文件。例如,您已成功将 Main.cpp 编译为 Main.obj

但是,链接器需要包含已使用的类或函数(如 .obj .lib 文件)的具体实现的文件,以替换这些“占位符”用实际的可执行代码。这就是为什么你还需要 Accout.lib 来链接 Main.exe

当然,在DLL的情况下,其 .lib 文件包含一个导入地址表(IAT)而不是“真实”可执行代码,通过该表引用所有DLL函数调用(每个引用的DLL函数)在IAT中包含自己的条目。在运行时,IAT填充了适当的地址,这些地址直接指向单独加载的DLL中的函数。

我希望这会有所帮助: - )