打印

C语言中库文件的问题?请高手解答

[复制链接]
1913|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robinyuan|  楼主 | 2008-1-30 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言中库文件的问题?请高手解答

(单片机中的C)
1、库文件的代码是无需编译而可直接被单片机执行吗?

2、库文件的产生源于是不是不想让人知道源代码?

3、库文件包含很多函数,是不是只有用到的函数代码才会被编译连接到目标文件?

4、如果第3个问题为真,则库文件的结构是如何构成的?编译器如何找到函数的入口地址?全域扫描?
    (不好意思,编译原理没学过)

相关帖子

沙发
mohanwei| | 2008-1-30 21:27 | 只看该作者

那就不妨看看……很难三两句话解释的

使用特权

评论回复
板凳
db10| | 2008-1-31 13:02 | 只看该作者

呵呵

 以前我做过库文件,所以知道点:
(单片机中的C)
1、库文件的代码是无需编译而可直接被单片机执行吗?
   库文件的代码已经编译后的文件,是所谓的.o文件,不是可执行文件,你可以直接调用和使用。
2、库文件的产生源于是不是不想让人知道源代码?
   有这样的道理。当然也是为了代码重复多次使用而编写成统一的,这样使用方便。
3、库文件包含很多函数,是不是只有用到的函数代码才会被编译连接到目标文件?
 你用到的函数才编译到你的项目里。
4、如果第3个问题为真,则库文件的结构是如何构成的?编译器如何找到函数的入口地址?全域扫描?
   库文件,也就是.c,.h等文件组成一个可以编译通过的项目文件,然后编译成库文件,不链接就可以了,当然想链接也没有关系,呵呵。
 至于如何编译器怎么工作的,那就没有研究。。。 还没有自己做过编译器,呵呵。
 

使用特权

评论回复
地板
tang.sc| | 2008-3-26 09:21 | 只看该作者

这个问题有水平

首先点一个库文件和平台是密切相关的,比如同是一个memcpy(void *src, const void *dest, int size)库函数在不同的硬件平台上他的实现是不一样的,这里主要有2点的不同,一个是cacheLine的支持方式,一个是不同硬件平台下由于编译器的不同在函数参数的传递方式不同,效率是不同的。库函数通常都是针对具体的目标硬件特性和编译器的特性做了优化的。

使用特权

评论回复
5
香水城| | 2008-3-26 11:20 | 只看该作者

ST的单片机包括ARM的芯片,所用的库文件都是以源程序方式提

因此,楼主的问题自然不成其为问题了。

使用特权

评论回复
6
lhj200304| | 2008-3-31 15:26 | 只看该作者

回答

(单片机中的C)
1、库文件的代码是无需编译而可直接被单片机执行吗?
   是的 ,链接的时候加入的 
2、库文件的产生源于是不是不想让人知道源代码?
   这只是一部分原因 
3、库文件包含很多函数,是不是只有用到的函数代码才会被编译连接到目标文件?
   是的 
4、如果第3个问题为真,则库文件的结构是如何构成的?编译器如何找到函数的入口地址?全域扫描?
    (不好意思,编译原理没学过)
这个我也不懂 

我在keil上自己做过库,很简单的,项目 输出类型 改一下就行了 
另外一个函数要单独写在一个c文件中 就行了 

使用特权

评论回复
7
xb007| | 2008-3-31 20:01 | 只看该作者

答案

1.库文件肯定是要编译才能被执的!编译器在编译时要分为几个阶段,在时链接,就会对库文件处理。
2.不只是为了让别人不知道源文件!更重要的是方便用户。给用户提供一个接口,调用就行了!就像API一样。
3.不用的函数是不会连接到目标文件的。如果这们的话,岂不会浪费很多存储空间。
4.库文件一般是一些公司针对特定的硬件平台而开发的。它实际上就是一些*.c,*.h文件组成的。把他们编译后的文件。这个文件需要特定的编译器才能使用。例如,对于uCOS-II操作系统的一些库文件,在ADS中可以用,而到了Keil(支持ARM指令)中就用不了。在编译整个项目文件时,编译器会自动地到库中找到你在源文件中所使用的函数。
答案不是很好,请高手指教!

使用特权

评论回复
8
high| | 2008-4-2 03:07 | 只看该作者

我说点看法.

首先,是不是已经确知了c/c++怎么编译的?

在c中call一个函数或者使用一个全局变量,实际使用的是符号,编译器会找到这个符号所代表的函数所在.在静态库lib中,保存着所有的符号,因此,这和c编译没有差别;动态库中才存在寻找函数入口的问题.当然,动态库会提供寻地址机制,应用需要根据函数名来寻址,一般在Load一个dll后,使用GetProcess来找到入口地址.对于c++,情况稍微有点不同,就是它的符号的格式和c不同,比如会在前后加一些独特的字符.这也是extern "c"存在的理由,这个声明告诉编译器,请按照c的格式来生成使用符号,从而c和c++可以兼容.

其次,关于不同架构,不同编译器,不同lib格式.
lib本质上只是obj的一个集合,所以,肯定的,不同架构的lib不能通用,比如,arm的lib自然不能在mips上面使用.

编译器和lib格式是同一个命题.对此了解不多,是否存在一个严格统一标准.(我想是存在的.)在windows下不要过于担心,ms说的算.大家自然要统一到它的标准.不然用不了它的库.不过,一般我们也不会这么时空错乱,交叉编译使用不同格式的库.

补充,库文件的产生,我理解,是源码形式上更高一个层级的模块化和封装,是一种思想升级后很自然的产物.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

133

帖子

0

粉丝