VS2010 error link2019无法解析的外部符号(VC6.0能正常执行)
最近使用VS2010中,使用类时发现了这个问题:详细描述如下:如果我将头文件ZeroProof.h里面的类定义以及
ZeroProof.cpp中的代码都转入main函数中,对类进行说明,程序也能正确执行,但是将两个进行分开,分别装
入两个文件,并在main函数文件中引用头文件,那么就会出现如下问题。(补充一点,在VC6.0中文件分开也能正
确执行)。为了方便大家共同研究,我将代码附录在后文中。
1> 所有输出均为最新。
1>Debug\ZeroProof.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定
1>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall CBigInt::Rab(void)" (?Rab@CBigInt@@QAEHXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CBigInt::Put(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,unsigned int)" (?Put@CBigInt@@QAEXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CBigInt::~CBigInt(void)" (??1CBigInt@@QAE@XZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: class CBigInt __thiscall CBigInt::Add(class CBigInt &)" (?Add@CBigInt@@QAE?AV1@AAV1@@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CBigInt::GetPrime(int)" (?GetPrime@CBigInt@@QAEXH@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CBigInt::Mov(unsigned __int64)" (?Mov@CBigInt@@QAEX_K@Z),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CBigInt::CBigInt(void)" (??0CBigInt@@QAE@XZ),该符号在函数 _main 中被引用
1>C:\Users\Administrator\Desktop\ZeroKnowledgeProof\Debug\ZeroKnowledgeProof.exe : fatal error LNK1120: 7 个无法解析的外部命令
1>
1>生成失败。
源代码部分:
main函数中部分:
#include <iostream>
#include <stdlib.h>
#include "ZeroProof.h"
//主函数,随机生成x×32位(二进制位)大素数并进行测试。
int main(void)
{
int i=0,x,y;
srand((unsigned)time(NULL));
CBigInt N;
CBigIntM;
CBigInt S;
string m_N="";
string m_M="";
string m_S = "";
x=1;y = 1;
cout<<"随机生成第一个"<<x*32<<"位大素数:\n"<<endl;
cout<<"随机生成第二个"<<y*32<<"位大素数:\n"<<endl;
cout<<"运算中,请耐心等待。。。。\n"<<endl;
N.Mov(0);M.Mov(0);S.Mov(0);
N.GetPrime(x);
M.GetPrime(y);
S.Add(M);
S.Add(N);
N.Put(m_N,16);
printf("\n");
M.Put(m_M,16);
S.Put(m_S,16);
i=N.Rab();
cout<<m_N<<"\n"<<"测试结果(1为素数,0为合数):"<<i<<endl;
i=M.Rab();
cout<<m_M<<"\n"<<"测试结果(1为素数,0为合数):"<<i<<endl;
cout<<"\n"<<"两个素数相加的结果:"<<m_S<<endl;
system("pause");
return 0;
}
ZeroProof.h中代码如下:
#include<string>
#include<iostream>
#include<string>
#include <time.h>
#include<stdlib.h>
#define BI_MAXLEN 35
#define DEC 10
#define HEX 16
using namespace std;
class CBigInt
{
public:
//大数在0x100000000进制下的长度
unsigned m_nLength;
//用数组记录大数在0x100000000进制下每一位的值
unsigned long m_ulValue[BI_MAXLEN];
CBigInt();
~CBigInt();
/*****************************************************************
基本操作与运算
Mov,赋值运算,可赋值为大数或普通整数,可重载为运算符“=”
Cmp,比较运算,可重载为运算符“==”、“!=”、“>=”、“<=”等
Add,加,求大数与大数或大数与普通整数的和,可重载为运算符“+”
Sub,减,求大数与大数或大数与普通整数的差,可重载为运算符“-”
Mul,乘,求大数与大数或大数与普通整数的积,可重载为运算符“*”
Div,除,求大数与大数或大数与普通整数的商,可重载为运算符“/”
Mod,模,求大数与大数或大数与普通整数的模,可重载为运算符“%”
*****************************************************************/
void Mov(unsigned __int64 A);
void Mov(CBigInt& A);
CBigInt Add(CBigInt& A);
CBigInt Sub(CBigInt& A);
CBigInt Mul(CBigInt& A);
CBigInt Div(CBigInt& A);
CBigInt Mod(CBigInt& A);
CBigInt Add(unsigned long A);
CBigInt Sub(unsigned long A);
CBigInt Mul(unsigned long A);
CBigInt Div(unsigned long A);
unsigned long Mod(unsigned long A);
int Cmp(CBigInt& A);
/*****************************************************************
输入输出
Get,从字符串按10进制或16进制格式输入到大数
Put,将大数按10进制或16进制格式输出到字符串
*****************************************************************/
void Get(string& str, unsigned int system=HEX);
void Put(string& str, unsigned int system=HEX);
/*****************************************************************
RSA相关运算
Rab,拉宾米勒算法进行素数测试
Euc,欧几里德算法求解同余方程
RsaTrans,反复平方算法进行幂模运算
GetPrime,产生指定长度的随机大素数
*****************************************************************/
int Rab();
CBigInt Euc(CBigInt& A);
CBigInt RsaTrans(CBigInt& A, CBigInt& B);
void GetPrime(int bits);
};
ZeroProof.cpp中代码如下部分:
#include "ZeroProof.h"
其他部分都是对类成员变量进行初始化的东西,在此略去。 VS2010中连接错误?2019
[解决办法]
你的程序是Windows的还是控制台的?控制台的主函数入口是main()而windows的主函数是winmain(),不一样的。
[解决办法]
ZeroProof.cpp
是不是這個文件沒加入到工程一起編譯。
[解决办法]
重建所有
[解决办法]
估计你的问题就是2楼说的
[解决办法]
VS2010中建立的是工程么……
[解决办法]
到编译的目录下看看有没有ZeroProof.obj文件
[解决办法]
编译器有时候就有这样的问题 清理掉 重新生成
[解决办法]
可能你的某個 宏 沒打開,
確保
ZeroProof.cpp所有内容都有編譯到。
可以隨便加入一些 字符 測試。。。