1、静态库
静态库(static library or archive)是几个object文件的组合。假设你有两个c文件,test1.c和test2.c,先用如下命令编译这两个文件:
gcc -c test1.c gcc -c test2.c
|
这样会生成两个object文件:test1.o和test2.o,再利用这两个文件来生成一个静态库文件,使用如下命令:
ar cr libtest.a test1.o test2.o
|
这样就生成了一个名为libtest.a的静态库文件。
再假设test1.c里面有一个函数叫做display,你的应用程序main.c可以调用这个display函数,编译的时候用如下命令:
gcc -o main main.c -L ./ -ltest
|
-L参数指明库的搜索路径,-l参数说明具体要链接的库。这样就可以像其他程序那样执行main可执行程序了。
2、动态库
动态库(shared library or dynamically linked library)和静态库主要有两个区别。第一个区别就是通过链接动态库编译程序时,所生成的目标代码中并不包含动态库中的代码,而只保存一个对动态库的引用信息;第二个区别就是动态库不仅仅是一些目标文件的集合,而是把几个目标文件合并成一个单独的文件,因此使用的时候不像静态库那样只链接所需要的目标文件,而是包含整个动态库文件。
同样,假设你有两个c文件:test1.c和test2.c,下面介绍如何把这两个文件编译成一个动态库文件。首先,编译test1.c和test2.c,使用如下命令:
gcc -c -fPIC test1.c gcc -c -fPIC test2.c |
-fPIC命令告诉编译器test1.o和test2.o将作为动态库的一部分进行使用。PIC是指Position-Independent Code。然后将这两个目标文件组合起来,生成一个动态库文件,命令如下:
gcc -shared -fPIC -o libtest.so test1.o test2.o |
这样就生成了一个名为libtest.so的动态库文件。和上面使用静态库一样的方法使用动态库,就不再介绍了。需要注意的是,执行动态链接的程序时,动态库文件所在的路径一定要包含在环境变量LD_LIBRARY_PATH当中,否则,找不到所使用的库文件时,程序不会成功执行。
阅读(1946) | 评论(0) | 转发(0) |