免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2938 | 回复: 3
打印 上一主题 下一主题

[C] 头文件和源码编译问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-23 19:25 |只看该作者 |倒序浏览
main.c(主程序)  more.c  more.h  see_more.c  see_more.h

为什么直接在main.c #include more.h 和 see_more.h 还是不能编译?  一定要先生成 more.o  , see_more.o文件,再链接编译才可以?

但是调用库函数只需要加载头文件,而不需要管其他什么实现代码在哪里,或者生成.o再编译?



另外我还做了一个实验, main.c 不 include more.h和see_more.h, 先生成more.o, see_more.o 同样能够编译成功。

论坛徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午马
日期:2014-10-19 13:40:31酉鸡
日期:2014-11-08 08:44:54处女座
日期:2014-11-10 17:01:21午马
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之广夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
2 [报告]
发表于 2013-09-23 20:36 |只看该作者
1.为什么直接在main.c #include more.h 和 see_more.h 还是不能编译?
              应该指定头文件的位置   -I xxxx.h
2.一定要先生成 more.o  , see_more.o文件,再链接编译才可以?

论坛徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午马
日期:2014-10-19 13:40:31酉鸡
日期:2014-11-08 08:44:54处女座
日期:2014-11-10 17:01:21午马
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16赛季CBA联赛之广夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
3 [报告]
发表于 2013-09-23 20:42 |只看该作者
1.为什么直接在main.c #include more.h 和 see_more.h 还是不能编译?
              不是标准库文件应该指定头文件的位置   -I xxxx.h
2.一定要先生成 more.o  , see_more.o文件,再链接编译才可以?
             一定
3.但是调用库函数只需要加载头文件,而不需要管其他什么实现代码在哪里,或者生成.o再编译?
        调用库函数只需加载头文件就可了,这是系统默认的
4.另外我还做了一个实验, main.c 不 include more.h和see_more.h, 先生成more.o, see_more.o 同样能够编译成功。
       编译的时候咱们链接的  静态库或共享库里不都是.o文件嘛,我们拿来就用

初学请值正:wink:

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
4 [报告]
发表于 2013-09-23 23:36 |只看该作者
回复 1# tom_fans
编译器编译c程序一般有这么几个步骤:预处理,汇编,编译,链接
只包括头文件后是可以走到编译完这个步骤,但是在链接时会报错,因为没有实现体。
调用库函数可以只加载头文件,是因为编译器会自动的链接一些基本库,而库函数的实现就在这些库里,所以没问题。但也不是所有的库函数,比如说pthread库就得自己用-lpthread来链接,否则就编不过。
不包括头文件可以编成功,是因为头文件中一般包括一些声明,而这些声明的作用主要是帮助编译器发现一些错误,比如函数的参数类型与调用时给的类型不匹配等等。我的理解是头文件主要目的是帮助编译器发现程序中的错误,它不是必须的。在go语言中就没有头文件了。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP