(一)编写和使用静态及动态连接库

@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种的

可能差很少,就是在运行时将动态连接库映射到进程地址空间中,而后修改可执行文件中某个段内的引用的函数的地址。

而静态连接其实是将使用到的代码静态添加到可执行文件的代码中,这样的话可执行文件固然会比较大。

注: 以上纯属我的的意见,若有问题,请给与修改,谢谢。      

相关文章
相关标签/搜索