C++多文件连编问题,显示连接出错。环境VC++6.0。有四个文件A.h、A.cpp、B.H、B.cpp,代码如下:
文件:A.hclassA{private:intx;public:A(int);};文件:A.cpp#include"A.h"A::A(inta){x=a;}文件B.h:...
文件:A.h
class A
{
private:
int x;
public :
A(int);
};
文件:A.cpp
#include "A.h"
A::A(int a)
{
x=a;
}
文件B.h:
#include "A.h"
class B
{
private :
int y;
public:
B(int);
};
文件B.cpp
#include "B.h"
B::B(int b)
{
y=b;
}
void main()
{
A a(3);
}
编译没错,连接的时候出错:
B.obj : error LNK2001: unresolved external symbol "public: __thiscall A::A(int)" (??0A@@QAE@H@Z)
Debug/B.exe : fatal error LNK1120: 1 unresolved externals
这是为什么? 展开
class A
{
private:
int x;
public :
A(int);
};
文件:A.cpp
#include "A.h"
A::A(int a)
{
x=a;
}
文件B.h:
#include "A.h"
class B
{
private :
int y;
public:
B(int);
};
文件B.cpp
#include "B.h"
B::B(int b)
{
y=b;
}
void main()
{
A a(3);
}
编译没错,连接的时候出错:
B.obj : error LNK2001: unresolved external symbol "public: __thiscall A::A(int)" (??0A@@QAE@H@Z)
Debug/B.exe : fatal error LNK1120: 1 unresolved externals
这是为什么? 展开
3个回答
展开全部
文件:A.cpp
#include "A.h"
A::A(int a)
{
x=a;
}
改成
A::A(int a)
{
x=a;
}
即去掉头文件的保护
这不是什么好办法,因为这需要对头文件和cpp文件的关系有一定了解才能掌握。
其实你链接出错的真正原因在于你把 A.h 包含了2次。
首先B.h包含了A.h, A.cpp里面也包含了A.h。
好的解决办法是价格宏定义防止头文件的重复包含。比如这样
把
文件:A.h
class A
{
private:
int x;
public :
A(int);
};
改成
文件:A.h
#ifndef __A_H__ //如果没定义这个宏
#define __A_H__ //那么就定义这个宏,于是如果重复包含发生了,就会发现这个宏已经定义,自然就相当于包含一个空的头文件了。
class A
{
private:
int x;
public :
A(int);
};
#endif
#include "A.h"
A::A(int a)
{
x=a;
}
改成
A::A(int a)
{
x=a;
}
即去掉头文件的保护
这不是什么好办法,因为这需要对头文件和cpp文件的关系有一定了解才能掌握。
其实你链接出错的真正原因在于你把 A.h 包含了2次。
首先B.h包含了A.h, A.cpp里面也包含了A.h。
好的解决办法是价格宏定义防止头文件的重复包含。比如这样
把
文件:A.h
class A
{
private:
int x;
public :
A(int);
};
改成
文件:A.h
#ifndef __A_H__ //如果没定义这个宏
#define __A_H__ //那么就定义这个宏,于是如果重复包含发生了,就会发现这个宏已经定义,自然就相当于包含一个空的头文件了。
class A
{
private:
int x;
public :
A(int);
};
#endif
追问
其实那些我都有,A和B的头文件都有条件编译,我是感觉太浪费空间就没占到网上。有了那些,但是还是出错,会不会是我的编译器出了问题,或者其他什么问题?
追答
好吧,其实我上面写那么长都是胡说的~~
真正的原因其实我也不能很肯定。因为我编译你的代码木有问题。也木有链接错误。
所以应该是你的编译器设置有误。我猜测最常见的问题就是你没有预编译头,项目里却设置成有预编译头。不过貌似你代码里本来就没包含什么预编译头。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你把文件B.h中
#include "A.h"改成#include "A.cpp"试一下
#include "A.h"改成#include "A.cpp"试一下
追问
改了之后是没有错了!十分感谢。但是我还是想问一下为什么,一般C语言直接#include头文件就行,为什么再C++要include .cpp文件啊?
追答
如果用IDE你需要把A.CPP加入工程里面才行.如果是命令行编译的,需要单独LINK,LINK的时候把A.OBJ和B.OBJ都LINK进去才行.对于多CPP的工程命令行编译,最好建立MAKEFILE用NMAKE生成最终文件.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#ifndef STACK_H
#define STACK_H
//stack.h头文件定义
。。。。
#endif
其他的如旧。
#define STACK_H
//stack.h头文件定义
。。。。
#endif
其他的如旧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询