免费注册 查看新帖 |

Chinaunix

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

对C语言动态库的粗浅理解,请诸位给点意见 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-04 21:28 |只看该作者 |倒序浏览
  在linux下,C语言的支持包是libc.so。c语言通过他的24个标准头文件声明了libc.so中实现的函数,以供程序员使用。这样,通过编译器和c语言语法作为c的规范;通过libc.so作为c的支持实现。
     按上面的说法先下推断,可以通过实现其他函数的.so文件,配上符合C语言规范的头文件,就可以让c语言编译器编译新的函数。比如多线程线程。这也算是对c语言的扩充吧。
     .so动态库应该是符合所在硬件平台的用该平台的指令对函数的实现。至于是汇编语言还是机器指令不确定。个人认为应该是机器指令。
      windows下的C原理与linux一样,在此就不多说了。

     上述是我对c语言动态库的粗浅认识。如果有错的,请给予指点。同时也希望诸位谈谈自己对动态库作用的看法。

在此有个问题:
     最近做的gps的试验中用到gps.h文件。这个头文件所对应的libgps.so是gps驱动的一部分、作为API接口提供的吧?同理,其他硬件设备若有类似的动态库,应该也都是其驱动提供的?这些对应硬件设备的动态库文件是不是由硬件厂商提供的?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-11-04 22:15 |只看该作者
执行的永远是机器语言,是二进制码,汇编只是助记符,看起来比机器码方便;不同的硬件驱动自然是有差别的,可以由厂商自己提供.但是一般来说,类似的硬件,如果这类硬件十分普及,可能会有一套业内的操作规范,也就是从应用层上面来看都一样.于是可能库文件不一定由厂商提供,当然,只是不一定.

论坛徽章:
0
3 [报告]
发表于 2008-11-04 23:39 |只看该作者
前半部分你其实就是在说自己实现一个动态库吧。

论坛徽章:
0
4 [报告]
发表于 2008-11-04 23:52 |只看该作者
最近做的gps的试验中用到gps.h文件。这个头文件所对应的libgps.so是gps驱动的一部分、作为API接口提供的吧?
头文件是接口定义,so是具体实现。C是这样子。
C++作者说,库设计就是语言设计。

论坛徽章:
0
5 [报告]
发表于 2008-11-05 00:07 |只看该作者
不同厂商提供的so、OS、toolchain遵循的ABI很可能不一样,虽然都是ARM和Linux。
VxWorks不同的版本之间的ABI都不一样,lz注意不要混用。

论坛徽章:
0
6 [报告]
发表于 2008-11-05 16:57 |只看该作者
能不能这样说,只要是一门编程语言,都会有类似动态库这样的文件,以实
现这个语言所提供的标准函数或类库的功能?

     如果上述正确。我想问问关于开源,比如说linux内核的开源。linux内核只
是把实现的源代码公开。而这些代码最终所用到一些基础的动态库的具体内容并
没有公开。这些动态库包括了标准C语言动态库,以及其他的动态库。是这样吗?
是不是基础动态库的内容对于软件开发没必要知道?算是分工思想的体现吧。

     顺便问一下,在C语言中有没有方法可以通过一个动态库查出都有哪些头文件
与之对应?或者反过来,通过头文件查出该文件声明的是哪个动态库的内容?
  
     坦白说,我才处于入门阶段,没做过深层次的开发。问这些底层的问题是出
于好奇,想提前知道故事结果而已。平时一直在思考、查资料。但还是不清楚,
所以才来问一下的。请大家见谅。

论坛徽章:
0
7 [报告]
发表于 2008-11-08 05:59 |只看该作者
我的理解是, 越往底层,用到别人的库就越少。写physical driver的,设置控制字就行了,基本不用别人的库。写logical driver的要include 写physical driver 的提供的库, 写application的也用到logical driver的提供的库。

楼主在6楼提到的linux操作系统也算是种大的application了,也要用到许多库。比如,文件系统(ext, fat32, ntfs 等等)要用到储存设备提供的库(比如ddb). 但在刚才提到的从低到高的库的引用过程中,大家可能会在某一层形成一些标准,定义一些标准的库。意思就是说,不管你底下是怎么实现的,我就按照统一的标准,去CALL 你的FUNCTION 或 SEND 你SIGNAL。

比如在OS这层有了posix. 我们在学习C语言的时候,即使是HOLLO WORLD,其实已经是在OS这层上运行了,因为OS 已经给我们提供了一个运行程序的环境(C RUN TIME)。我想楼主提到的标准函数库应该就是指它了。

论坛徽章:
0
8 [报告]
发表于 2008-11-08 12:01 |只看该作者

回复 #6 hnayyc 的帖子

>能不能这样说,只要是一门编程语言,都会有类似动态库这样的文件,以实
>现这个语言所提供的标准函数或类库的功能?

不是绝对的, 和具体语言有关

>     如果上述正确。我想问问关于开源,比如说linux内核的开源。linux内核只
>是把实现的源代码公开。而这些代码最终所用到一些基础的动态库的具体内容并
>没有公开。这些动态库包括了标准C语言动态库,以及其他的动态库。是这样吗?
>是不是基础动态库的内容对于软件开发没必要知道?算是分工思想的体现吧。

linux内核是不用外部的库的, 他也不能用应用层的c库, 也就是说它是一个自完备的代码


>    顺便问一下,在C语言中有没有方法可以通过一个动态库查出都有哪些头文件
>与之对应?或者反过来,通过头文件查出该文件声明的是哪个动态库的内容?

可以从动态库中读取到符号信息, 再根据这些符号信息去找对应的头文件
  
>     坦白说,我才处于入门阶段,没做过深层次的开发。问这些底层的问题是出
>于好奇,想提前知道故事结果而已。平时一直在思考、查资料。但还是不清楚,
>所以才来问一下的。请大家见谅。

建议看<深入理解计算机系统>

论坛徽章:
0
9 [报告]
发表于 2008-11-08 12:56 |只看该作者

回复 #1 hnayyc 的帖子

我对库的理解是这样的:
运行的程序是一个线程,是一个指令流的序列。而库提供了指令流进入我们自己写的程序(比如main函数)前的准备工作的代码和退出函数时清理工作的代码。相当于库在我们的代码片断前后提供另外的代码片断封装,形成了一条可以执行的指令流。这个工作是编译器在编译和链接的时候自动加入的。另外库提供了我们函数中调用的一些api。
因此库必然是和操作系统和cpu关系密切的。这两个有一个不一样,库也必然不一样。
至于写库用的语言和我们程序用的语言是否一致应该没关系吧。反正编译后都是汇编了(我们不讨论java那种解释执行的德语言),但是在我们调用库函数的时候,传参数和返回值得约定得是一致的。比如一个库是用c写的,在linux x86系统上,如果有另一种语言b,采用和c语言相同的传参和返回值约定,那么就应该是可以直接调用的吧,或者可以搞个适配层转换一下就可以了。
不知道以上的理解是否有问题,大家给个意见。

论坛徽章:
0
10 [报告]
发表于 2008-11-09 17:00 |只看该作者
原帖由 hnayyc 于 2008-11-5 16:57 发表
能不能这样说,只要是一门编程语言,都会有类似动态库这样的文件,以实
现这个语言所提供的标准函数或类库的功能?
     如果上述正确。我想问问关于开源,比如说linux内核的开源。linux内核只
是把实现的源代码公开。而这些代码最终所用到一些基础的动态库的具体内容并
没有公开。这些动态库包括了标准C语言动态库,以及其他的动态库。是这样吗?
是不是基础动态库的内容对于软件开发没必要知道?算是分工思想的体现吧。
     顺便问一下,在C语言中有没有方法可以通过一个动态库查出都有哪些头文件
与之对应?或者反过来,通过头文件查出该文件声明的是哪个动态库的内容?
     坦白说,我才处于入门阶段,没做过深层次的开发。问这些底层的问题是出
于好奇,想提前知道故事结果而已。平时一直在思考、查资料。但还是不清楚,
所以才来问一下的。请大家见谅。

1)不是所有的语言都有动态库的。譬如,以前的老语言就都没有。
2)UNIX(Linux)的库函数也是公开源码的。
感觉你对“动态库”的概念还没掌握吧?动态库是采用动态分配方式为库函数代码分配空间。还有静态方式的静态库函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP