社区
C语言
帖子详情
编译两个.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
打赏
收藏
编译两个.o文件是什么意思~
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了 这个是什么情况?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
VScode如何
编译
多个.C
文件
VScode不能像MOOC上面讲的Devc++那样子。 “从
编译
器的角度看,一个.C
文件
是一个
编译
...在有些IDE中分开
两个
按钮
编译
和构建,compile只是产生.O
文件
, 而build才是把这些.O
文件
连接起来形成一个可执行的程序 而DEVC..
[MDK] KEIL
编译
文件
生成的.O
文件
发生了重命名情况
大概过程是 生成一个 a.o ,然后把a.C的位置变动了 再次
编译
,结果又生成一个a.o,这
两个
a.o在一个
文件
夹下,结果提示要重新命名。下面这个帖子 也说了这个事情: 《[MDK] KEIL
编译
文件
生成的.O
文件
发生了重命名情况...
一个Makefile同时
编译
多个.c
文件
在写作业时想用一个Makefile同时
编译
多个.c
文件
并生成可执行
文件
,在查找了相关资料后,发现可以添加一个伪可执行
文件
。 makefile 默认只生成第一个可执行
文件
,所以可以用伪可执行
文件
,make 过程中并不生成 这个伪...
如何使用GCC将多个.c
文件
编译
成一个.s
文件
如果我们有多个源
文件
,想要把他们
编译
成一个.s
文件
,有正向反向两种方法, 1.反向很简单,就正常
编译
成可执行,然后使用objdump反汇编即可: objdump -d mcf_s &> mcf_s.s 2.正向直接
编译
使用如下的命令是...
Linux下C++/C
编译
生成.a 或者.so 库
文件
一般程序
编译
的过程可以分为
编译
和链接
两个
阶段。链接阶段,需要把所有的obj
文件
(.o)链接起来,生成可执行程序,这个过程可以链接其他外部的库
文件
。 有时候也有省略写法。 gcc -c test.c #源
文件
编译
,生成 .o ...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章