首页 文章

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

提问于
浏览
1

我使用一个简单的编辑器编写了我的项目,并通过命令行界面使用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:未解析的外部符号函数_main Main.obj中引用的“public:int __thiscall Acc ount :: getBalance(void)”(?getBalance @ Account @@ QAEHXZ):错误LNK2019:未解析的外部符号“public:__thiscall Account :: Account(int)”( ?? 0Account @@ QAE @ H @ Z)在函数_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 回答

  • 4

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

  • 0

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

  • 1

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

  • 1

    假设您已将Account.cpp编译为Account.dll,编译器也应生成导入库Account.lib . 那你的link指令应该是:

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

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

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

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

    我希望这有帮助 :-)

相关问题