Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567875
  • 博文数量: 213
  • 博客积分: 6789
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-01 17:11
文章分类

全部博文(213)

文章存档

2012年(9)

2011年(62)

2010年(99)

2009年(43)

分类: C/C++

2009-12-07 15:17:08

.dll是程序运行时候才执行的文件,所有的.dll都是可执行的。动态链接只是建立一个引用的接口,而另外的代码和数据存放在另外的可执行模块中,需要时候载入。

.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。如果你想使用lib文件,就必须:   
  1.   包含一个对应的头文件告知编译器lib文件里面的具体内容   
  2.  设置lib文件允许编译器去查找已经编译好的二进制代码   
    
  如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。



库可以有三种使用的形式:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。

例:A B C D 都用到lib A B C D各4K 假设lib 10k dll 2k (dll < lib)
静态编译: A B C D + 4lib = 4*4+4*10=56k
动态编译: A B C D + lib +4dll = 4*4+lib+4*2=34k

/*   hello.c   */
#include
void sayhello(void)
{
    printf("say hello\n");
}

/*  test.c   */
#include
int main(void)
{
    sayhello();
    return 0;
}

gcc -c hello.c -o hello.o
gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
gcc -c test.c libhello.so -o test

阅读(907) | 评论(0) | 转发(0) |
0

上一篇:struct.unpack

下一篇:压缩

给主人留下些什么吧!~~