我使用一个简单的编辑器编写了我的项目,并通过命令行界面使用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 回答
显然你忘了在命令行参数中包含
Account.obj
:/out:Main.exe Main.obj Account.obj
它看起来你只是从Main.obj创建Main.exe;你应该链接Account.obj .
您似乎没有将Account.obj链接到Main.exe . 你命名为Main.obj,但不是Account.obj .
假设您已将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中的函数 .
我希望这有帮助 :-)