@1 编写和使用静态连接库(archive)windows
示例1.1:app
test.c: #include <stdio.h> void func(){ printf("library func\n"); } test1.c: #include <stdio.h> void func1(){ printf("library func1\n"); } app.c void main(){ func(); func1(); }
编译test.c ,test1.c, app.c为目标文件:函数
gcc -c test.c test1.c app.cspa
打包为静态库:code
ar cr ./staticLib/libtest.a test.o test1.o进程
连接输出到运行目标文件:io
gcc -o app app.o -L./staticLib -ltest编译
@2 编写和使用动态库(shared object)table
一样使用示例1.1中的代码做为示例:class
gcc -c -fPIC test1.c test.c
而后将test1.o 和test.o 输出为一个动态连接库文件
gcc -shared -fPIC -o ./shareLib/libtest.so test1.o test.o
ok,以上完成后,连接到输出目标:
gcc -o app app.o -L./shareLib -ltest -Wl,-rpath,//home/shawn/workspace/nixExample1/shareLib
-Wl后面的选项为改变运行时ld的选项,能够经过ld --help查看一下,该处是经过rpath选项改变executable
文件app运行时查找动态连接库的路径。
@3 静态连接库和动态连接库的区别
最基本的区别之一是当动态连接库被连接时,最终的可执行文件并不包含动态连接库中的代码。跟windows种的
可能差很少,就是在运行时将动态连接库映射到进程地址空间中,而后修改可执行文件中某个段内的引用的函数的地址。
而静态连接其实是将使用到的代码静态添加到可执行文件的代码中,这样的话可执行文件固然会比较大。
注: 以上纯属我的的意见,若有问题,请给与修改,谢谢。