头文件包含顺序以及连接问题

degree_37 2008-07-20 10:04:04
关于连接,它真正的原理我不是很清楚,请高手指点找哪些资料看一下会清晰一些呢

我在一本书上看到一句话:避免因包含头文件的顺序不当而造成连接错误,请高手以这个错误的可能产生原因帮忙稍微解释一下~~,谢谢
...全文
784 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2008-07-21
  • 打赏
  • 举报
回复
避免头文件重复包含,用这个就好了
#ifndef XXX 
#define XXX

#endif


想理解编译过程,可以学习一下Makefile
uaxion 2008-07-21
  • 打赏
  • 举报
回复
你说的设置是针对ide的吧,对ide太依赖了。
以前我也是,对编译链接的概念一直停留在书本上
[Quote=引用 13 楼 degree_37 的回复:]
cl是什么? windows编译都是用这个么?

#分别执行
link main.obj lib1.lib lib2.lib
main.exe

link main.obj lib2.lib lib1.lib
main.exe

这里的链接顺序是我们可以人为选择的么,如果可以,如何设置呢?
[/Quote]
uaxion 2008-07-21
  • 打赏
  • 举报
回复
试试就知道了,你有发帖子的功夫早都得出结论了

lib2.obj : error LNK2005: _add already defined in lib1.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found

这是我们编译原理老师当年举的一个例子,lib的包含顺序不同是有区别的。
[Quote=引用 12 楼 laomai 的回复:]
楼上的,为什么你要生成lib文件呢,直接
cl main.obj lib1.obj lib2.obj main.exe不行么?
[/Quote]
chlaws 2008-07-21
  • 打赏
  • 举报
回复
ms没关系吧,首先都是进行预处理,然后编译产生obj,最后加入lib进行link 产生.exe
degree_37 2008-07-21
  • 打赏
  • 举报
回复
cl是什么? windows编译都是用这个么?

#分别执行
link main.obj lib1.lib lib2.lib
main.exe

link main.obj lib2.lib lib1.lib
main.exe

这里的链接顺序是我们可以人为选择的么,如果可以,如何设置呢?
laomai 2008-07-21
  • 打赏
  • 举报
回复
楼上的,为什么你要生成lib文件呢,直接
cl main.obj lib1.obj lib2.obj main.exe不行么?
uaxion 2008-07-21
  • 打赏
  • 举报
回复
补上main.c
#include <stdio.h>
#include "lib.h"

void main()
{
int i= 4,j = 8;
printf("%d+%d=%d\n", i, j, add(i,j));
}
uaxion 2008-07-21
  • 打赏
  • 举报
回复
按照以下步骤走一遍,用windows的cl编译
首先建立4个文件
main.c

add.h
int add(int, int);

lib1.c
int add(int i, int j)
{
return i+j;
}

lib2.c
int add(int i, int j)
{
return i*j;
}


#在命令行下执行,找不到cl的去Program Files\Microsoft Visual Studio\VC98\Bin
cl /c main.c
cl /c lib1.c
cl /c lib2.c
#生成了main.obj lib1.obj lib2.obj三个文件
#执行
link /lib lib1.obj
link /lib lib2.obj
#生成了2个文件lib1.lib lib2.lib

#分别执行
link main.obj lib1.lib lib2.lib
main.exe

link main.obj lib2.lib lib1.lib
main.exe
#只是顺序不同就会有不同的结果,而且并不报错
晨星 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 degree_37 的回复:]
引用楼主 degree_37 的帖子:
因包含头文件的顺序不当而造成连接错误


还是没得到我想要的答案...是不是这种错误很少见啊
[/Quote]
我也觉得很少见。
好的头文件应该是自完备的,不应该要求使用者再去注意什么“前提”或“次序”。
degree_37 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 degree_37 的帖子:]
因包含头文件的顺序不当而造成连接错误
[/Quote]

还是没得到我想要的答案...是不是这种错误很少见啊
degree_37 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 degree_37 的帖子:]
关于连接,它真正的原理我不是很清楚,请高手指点找哪些资料看一下会清晰一些呢
[/Quote]

有没有可以高手指点一下要去哪里看一看编译和连接的原理呢?
lunarfan 2008-07-20
  • 打赏
  • 举报
回复
#ifndef XXX
#define XXX

#endif
加这个
iBug168 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenyonghua521 的回复:]
有可能造成编译错误吧!
如果能编译过了,怎么会影响连接呢,想不通!
等高手解答!
[/Quote]


那你要去study一下编译跟链接的关系...

根本不是一回事....
qqwx_1986 2008-07-20
  • 打赏
  • 举报
回复
mark
chenyonghua521 2008-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iidioter 的回复:]
#param once

#ifndef XXX
#define XXX

#endif
[/Quote]
这仅仅是为了防止该文件被其它文件重复包含!
但即使重复包含了也只可能会造成编译错误啊!
chenyonghua521 2008-07-20
  • 打赏
  • 举报
回复
有可能造成编译错误吧!
如果能编译过了,怎么会影响连接呢,想不通!
等高手解答!
iBug168 2008-07-20
  • 打赏
  • 举报
回复
#param once

#ifndef XXX
#define XXX

#endif

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧