我使用简单的编辑器编写了我的项目,并通过命令行界面使用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文件,当它们的源代码不可用时使用这些编译文件。
提前致谢。
答案 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中的函数。
我希望这会有所帮助: - )