编译两个.o文件是什么意思~

saiwai1234567 2011-12-15 11:49:38
MAC系统

执行几个C语言文件,
执行代码是这样的


1. gcc -Wall -c -o ana.o ana.c
2. gcc -Wall -c -o round.o rounda.c
3. gcc -Wall -o cal rounda.o ana.o –lm
4. ./cal


第三句的两个.o文件是什么关系呢
怎么连接的?
不太懂!

我一般都是gcc -Wall -c -o ana.o ana.c
之后就直接执行./ana.o了

这个是什么情况?
...全文
609 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
duruos 2011-12-24
  • 打赏
  • 举报
回复
.o是生成的目标文件吧,还没连接的 -c 命令是生成目标文件,最后一句包含的有连接,-lm时连接时用m库
ReMeppo 2011-12-23
  • 打赏
  • 举报
回复
劲草 2011-12-23
  • 打赏
  • 举报
回复
看一看编译的过程吧,了解一下cc/ld/loader/ar,看看elf文件是什么样本,怎样被加载到内存运行运行的。有助于你在编程这一块的长期发展
zhq445078388 2011-12-23
  • 打赏
  • 举报
回复
gcc是编译连接器。。
卡卡_苏米 2011-12-23
  • 打赏
  • 举报
回复
.o文件就是目标文件啊,如果你知道编译原理的话就知道gcc 过程中是会生成许多过渡文件的,还有预处理等等
saiwai1234567 2011-12-22
  • 打赏
  • 举报
回复
您说对了~~
[Quote=引用 20 楼 cn7712 的回复:]

书本一定没有仔细看,作一本C语言入门书都会讲链接.
[/Quote]
saiwai1234567 2011-12-22
  • 打赏
  • 举报
回复
谢谢推荐~

[Quote=引用 6 楼 zhao4zhong1 的回复:]

《程序员的自我修养——链接、装载与库》
[/Quote]
CN7712 2011-12-18
  • 打赏
  • 举报
回复
书本一定没有仔细看,作一本C语言入门书都会讲链接.
xunxun 2011-12-17
  • 打赏
  • 举报
回复
和头文件无关

头文件是编译阶段,是让编译器理解你的语法生成.o

然后就是解决.o的符号链接/crt/程序入口等问题了

这就是链接做的事情

而链接器并不是那么智能的,除了预定义的spec(写死的,编译编译器时完成),就是你给的.o,否则会找不到符号而造成链接失败 (VC不一样,它可以在.obj里通过pragma写lib链接信息传给链接器,gcc只会根据既有的spec和.o,各有优缺点)
灼眼的超哥 2011-12-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xunxun1982 的回复:]

和头文件无关

头文件是编译阶段,是让编译器理解你的语法生成.o

然后就是解决.o的符号链接/crt/程序入口等问题了

这就是链接做的事情

而链接器并不是那么智能的,除了预定义的spec(写死的,编译编译器时完成),就是你给的.o,否则会找不到符号而造成链接失败 (VC不一样,它可以在.obj里通过pragma写lib链接信息传给链接器,gcc只会根据既有的spec和.o,……
[/Quote]
有时头文件不包含也没多大问题,一般的头文件只是声明函数的原型,以及定义一些要使用到的结构体之类的数据类型。
如果不包含声明你调用的函数所在的头文件,编译器会警告,因为它不知道你传给这个函数的参数是否与被调用的函数支持的实际参数类型一致,包含头文件,会有助于更好的解决因传递的参数类型不对而导致的错误。
灼眼的超哥 2011-12-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 saiwai1234567 的回复:]

正因为不会!才在这里问啊。。。。
这是来帮我解决问题来了,
还是来炫耀自己的知识来了?

引用 13 楼 liuchao35758600 的回复:

等你会把多个函数的源代码分别写到不同的C文件里时,你就明白这个的作用了。
[/Quote]
你从哪里可以看出我是来这里炫耀知识了?
这个的作用,在上个回复里已经明确说明了:
如果有多个函数的源代码分别写在不同的C文件,编译时想要自己的main函数能够使用已经被分散至多个C文件里的函数,那就可以先把这些C文件全部编译成o文件,最后,使用形如:gcc -o main mian.o a.o b.o c.o e.o的命令,将它们链接成一个可执行文件,你可以看成是把它们合并成一个整体,这时,main函数就能正确的使用这些函数了,这个是静态编译,以后你会了解到动态编译,动态库相关的知识。

小程序的源码,包括main函数,一般全部写在一个C文件里,直接gcc -o xxxx.c;./xxxx;就可以运行。
而大程序,使用的函数较多,代码量大,代码编写者为了以后方便修改代码,更容易找到漏洞,并且在编译时,减少编译的耗时,他们一般会将自己写的函数的源代码分类存储至多个C文件里,想编译,就把这些C文件全部编译,最后链接成一个可执行文件,以后修改源代码,只需要重新编译这个源代码所在的C文件即可,之后再链接,这样,编译一个C文件的代码所需的时间,会比编译一个集齐所有自己写的函数的源代码的C文件更少。
saiwai1234567 2011-12-16
  • 打赏
  • 举报
回复
不是任何两个.o文件都可以连接吧。

还是需要一个头文件,声明一下那几个.c文件是互相连接的,

我理解的对不对啊~

[Quote=引用 14 楼 andy_y39548 的回复:]

一个工程可能需要N多的.O文件,然后把这些.o链接起来就可以生成了可以执行程序
[/Quote]
saiwai1234567 2011-12-16
  • 打赏
  • 举报
回复
正因为不会!才在这里问啊。。。。
这是来帮我解决问题来了,
还是来炫耀自己的知识来了?

[Quote=引用 13 楼 liuchao35758600 的回复:]

等你会把多个函数的源代码分别写到不同的C文件里时,你就明白这个的作用了。
[/Quote]
andy_y39548 2011-12-16
  • 打赏
  • 举报
回复
一个工程可能需要N多的.O文件,然后把这些.o链接起来就可以生成了可以执行程序
灼眼的超哥 2011-12-16
  • 打赏
  • 举报
回复
等你会把多个函数的源代码分别写到不同的C文件里时,你就明白这个的作用了。
aozhi 2011-12-16
  • 打赏
  • 举报
回复
严格的说,第三步是链接,由链接器完成。
前两步才是编译。
薛定谔之死猫 2011-12-16
  • 打赏
  • 举报
回复
编译单元,由.c生产,可以打包成.a用户静态连接~
saiwai1234567 2011-12-16
  • 打赏
  • 举报
回复
所谓的共同链接,是指有共同的函数?
并且这2个.c文件中,分别有main函数。

两个有main函数的c文件编译成.o文件,通过什么能链接?

共同的头文件?
共同的变量?
还是共同的函数哦?
或者有引数之类的?



[Quote=引用 7 楼 wallwind 的回复:]

通常,每个工程都会生成N多个.o文件。然后共同链接进去。。。。。生成一个目标文件,建议楼主去看一下,c语言的一个编译过程。。。大概分为五步走,这里不再赘述。百度很多!!!
[/Quote]
TMAC10052120353 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 logicouter 的回复:]
GCC不单单是个编译器,还有链接的功能。第三句用于链接,并生成可执行程序。
[/Quote]
+1
logicouter 2011-12-15
  • 打赏
  • 举报
回复
GCC不单单是个编译器,还有链接的功能。第三句用于链接,并生成可执行程序。
加载更多回复(6)

69,371

社区成员

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

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