免费注册 查看新帖 |

Chinaunix

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

[C] 有一些基本概念(.h .o .so lib libc glibc)我一直没有搞清,希望高人指教一下,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-27 12:09 |只看该作者 |倒序浏览
RT.

在学习C语言的时候,总会遇到这么一些东西:

.h —— 头文件,要include进来,这个我知道,但它和lib有没有什么关系?

.o —— o是目标的意思吗?目标文件,跟lib有什么关系?

.so —— 我感觉这种文件跟Windows底下的那种DLL很像,但我不确定。

lib —— 到底什么是“库”?“标准库”、“标准函数库”、“标准库函数”三者到底是什么关系呢?

libc —— 这个概念的具体含义是什么呢?在从源代码文件编译成可执行文件的过程中,到底是个什么角色呢?

glibc —— 同上。

我觉得这些都应该是基本概念方面的,但我是菜鸟,底子差,一直没有搞清楚它们,看了一些教材,包括网上的教程,都感觉他们要么没有讲清楚(或许真的是我悟性太差)要么干脆就没有讲解。

我不太喜欢那种总是讲什么分支、控制、算法的基础书,我觉得上面的问题可能才是真正的基础,搞不清楚它们,我心里很不踏实,觉得学习C语言编程起来,总是很卡。

希望得到各位高人的指教,谢谢你们了!

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
2 [报告]
发表于 2012-10-27 12:17 |只看该作者
.h 头文件,包含模块的接口.

.o  object文件,编译后生成的,链接的时候用它

.so 动态库,对应的有个.a静态库.  这个c专家和深入计算机系统都有说明.

lib只是表示是库的意思而已吧.

libc, C语言基本库.

glibc,  GNU的c库.

论坛徽章:
0
3 [报告]
发表于 2012-10-27 12:39 |只看该作者
谢谢高人!

.h 头文件,包含模块的接口.

—— 对了,这两个概念,我都还没来得及提:

模块的具体含义是什么?比如说,我自己写一个函数,它能称之为模块吗?如何将它当作模块(来使用)?

接口这个概念,计算机里最经常碰到。我在草草地学习Java的时候遇到过,但肯定也是没有搞清楚。我目前的理解层次是:接口就是一个被包装的东西,里外联系的窗口,那么,函数的参数以及函数的返回包括类型,算不算接口?我是不是想得太幼稚呢?

.o  object文件,编译后生成的,链接的时候用它

—— 我是不是可以这样理解呢:.o也是二进制代码文件,但不能被直接运行,因为其中的执行入口是“悬浮”的,需要链接器将它们“绑定”或者“固定”下来。把若干个这种.o里面的执行入口绑定好了,才能让调用可执行文件的操作系统(外壳?)找准可执行的入口或者次序。我这样的理解,恐怕也很幼稚吧?所以,我需要得到各位高人的指教。

.so 动态库,对应的有个.a静态库.  这个c专家和深入计算机系统都有说明.

—— 关于“动态”和“静态”,我也经常遇到这些概念。这里的动态,是不是意味着,在程序运行的时候,在进行上述的绑定过程呢?纯属瞎猜的。

lib只是表示是库的意思而已吧.

libc, C语言基本库.


—— 这是C语言(标准)的一部分吗?那么,这些库,在操作系统或者我的GCC环境里,到底是什么样的形态存放的呢?比如说,是那种文件?格式?位置?如何查看?

glibc,  GNU的c库.

—— 除了GNU的C库,肯定还有别的组织的库,对不?那么,如何在程序的源代码中,体现出怎么用它们?

希望得到高人们的具体指导!

谢谢!






论坛徽章:
0
4 [报告]
发表于 2012-10-27 13:25 |只看该作者

1. 关系就是如果你要用那个lib, 你就应该#include它. 一般它只是用来提供向前声明. 除此之外没有任何关系.

2. o即object file. 它一般用来打包成静态库, 即一个静态库(ar档)包含一个或多个object file.

3. so即shared object. 简单地说就是dll(dynamic linked library), 只不过so一般在unix like系统, dll在MS系统.

4. lib要么是由object files打包成的静态ar档, 要么是so档. C的标准库即libc, 一般是一个so. 标准函数库即标准库. 标准库函数即标准库提供的函数, ex, printf.

5. libc即C标准库. 功能是提供调用例程, 如printf. 不过实际上标准库没那么简单, 先不管, C学到一定程度了再说.

6. glibc即是GNU实现的libc, 简单地说在linux系统上libc, glibc, 标准库是同义词.

=======================

数据结构, 算法, 语言和计算导论之类的才是内功. LZ说的这些东西当然也重要, 也算是内功基础, 不过基础比较扎实后还是会偏向于前者. 即使比较特殊的kernel领域, 最终也仍旧是归结于数据结构和算法, 因为内核就是一个大的数据结构. 说内核里面有OOP抽象之类的先放一边吧. 程序 = 数据机构 + 算法, 其实dijkstra大师从来就没错过, 说dijkstra大师少算东西的才是自以为聪明. 当然, 不管如何语言都是非常非常重要的考量因素, 但仍旧不妨碍dijkstra大师的论断.

C是实践性很强的语言, 刚开始的时候多练习才是王道(VIM + gcc on Linux), 一些基本的数据结构和算法要能信手拈来(链表, 栈, 队列, AVL树, 各种数组排序算法 -- 另外要明白AVL树实际就是快排链表版 -- 不过一般将其时间复杂度分摊到插入/平衡操作上了, 然后基本2分查找[排序是为了查找, 这是基本思想]. 基础没问题了再说吧), 过了这个才去考虑更进一步的事情.

建立起对系统的理解也很重要. 《Linux程序设计》和APUE均可. 这个期间要建立串行和并行, 同步和异步的观念. 要理解同步即阻塞, 异步即通知. 要理解进程和线程. 要区分并行的层次, 比如指令级并行和系统级并行.

杂学Makefile shell脚本之类的需要, 而且有时候往往能救命.

接下来再次去理解C语言. 去理解预处理器, 编译器, 汇编器, 链接器都做了什么(真正地理解, 不能太浮于表面. 你可以猜不到编译器做什么, 但你必须要知道预处理和链接器做了什么). 对编译期和运行期要有概念. 要理解二进制文件格式和虚拟内存区域. 要理解栈和调用约定. 要能把汇编当C代码写, 随便哪个平台 -- 重要的是知道汇编器做什么(比如知道指令和伪指令的差别, 知道指令助记符和实际二进制指令的差别), 因为已经理解了栈和调用约定, 所以只要熟悉了指令, 把汇编当C代码写一点问题都没有.

为什么理解链接器做什么是很重要的, 因为要写链接脚本.

然后恭喜你, 你可以在裸机/裸版上构建自己的"操作系统"了. 同时, Linux内核的大门也向你敞开了.

然后没有然后, 这时你自己就知道什么东西是你需要的. 你也可以考虑写一个玩具语言. 简单的玩具语言并不十分困难, 几千行甚至几百行代码就可以做到(几百行来说, 就是一个计算器, 不过可以定义变量什么的).

=======================

然后你还是一个菜鸟, 跟我一样的菜鸟.

=======================

论坛徽章:
0
5 [报告]
发表于 2012-10-27 13:42 |只看该作者
libc库放在/usr/lib

静态库意味著, 静态链接器对你的程序和库进行地址重定位和绑定. 同时你的程序生成的二进制文件中包含一个该库的副本.
动态库意味著, 如果你的程序引用了一个动态库中的一个函数, 那么静态链接器将根据你的程序查找动态库中有没有对应的函数符号. 你的程序生成的二进制文件中不会包含该库的副本, 但是会包含一些必要的信息. 同时它也意味著, 当你的程序执行时会和相应的动态库进行一次动态地址绑定 -- 如果此时动态库尚未加载, 那么加载它之后进行动态地址绑定, 如果此时动态库已经加载, 那么进行动态地址绑定. 动态地址绑定操作由操作系统幕后的动态链接器完成.

论坛徽章:
0
6 [报告]
发表于 2012-10-27 14:05 |只看该作者
madaossan 发表于 2012-10-27 07:42
libc库放在/usr/lib

静态库意味著, 静态链接器对你的程序和库进行地址重定位和绑定. 同时你的程序生成的 ...


Mark楼上高人一下,待仔细品味,呵呵 ……

高人,你还菜鸟啦,那我不是鸟蛋壳了 ……

论坛徽章:
0
7 [报告]
发表于 2012-10-27 23:38 |只看该作者
自顶一下。

论坛徽章:
0
8 [报告]
发表于 2012-10-28 09:30 |只看该作者
.h —— 头文件,要include进来,这个我知道,但它和lib有没有什么关系?

.o —— o是目标的意思吗?目标文件,跟lib有什么关系?

.so —— 我感觉这种文件跟Windows底下的那种DLL很像,但我不确定。

lib —— 到底什么是“库”?“标准库”、“标准函数库”、“标准库函数”三者到底是什么关系呢?

libc —— 这个概念的具体含义是什么呢?在从源代码文件编译成可执行文件的过程中,到底是个什么角色呢?

glibc —— 同上。
.h C和其他一些语言认为的头文件的默认后缀。你不用.h,会由此影响到一些默认的操作。
.o 同上,通常用于目标文件。所谓目标文件可以看作准程序,无非没有连接而已。可库,可以看做,后者是仓库,前者是零件。
.so 基本如你所说。
lib 一个名字而已,不需要太在意。
glib 同上。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2012-10-28 09:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP