.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
阅读(934) | 评论(0) | 转发(0) |