动态链接库和静态链接库:
首先理解两种生成可执行程序的链接方式:
动态链接:
链接动态库,只是在生成的程序中记录库中的函数信息表,并没有将具体代码实现写入程序中,所以依靠动态链接生成的程序在运行时,需要依靠动态库的存在
具体实现代码在内存中共享,不存在代码冗余
静态链接:
链接静态库,在生成的程序中直接将库中所需要的函数代码实现直接拷贝到执行程序中,导致生成的程序所占空间比较大,但无需任何依赖,方便移植
库的生成步骤:
- 将源码经过汇编编译后,生成二进制指令
gcc -fPIC -c testlib.c -o testlib.o
注:-fPIC选项的意义:是为了产生位置无关代码 在进行汇编编译时,此时代码中的所调用的库函数都是记录了相对库在内存中映射起始地址的偏移量,即每一个库函数地址并不确定,而是根据映射后库的起始地址+偏移量来寻找对应的函数地址进行调用。
2.将编译完成后的二进制指令组织打包成为库文件
- 动态库:gcc --shared testlib.o ... -o libtestlib.so
- 静态库:ar -cr libtestlib.a testlib.o ...
库的使用:
- 生成可执行程序时链接使用:使用-l选项指定要链接的库名称
gcc main.c -o main -ltestlib
使用注意事项:
1.库文件必须放在指定路径下:/usr/lib64 (gcc链接器会 在默认路径下去找对应的库)
2.设置环境变量:export LIBRARY_PATH=$LIBRARY_PATH:/ (设置环境变量 库地址路径为当前路径)
3.使用gcc的 -L 选项指定库路径:gcc main.c -o mian -L./ -ltestlib
- 运行可执行程序时加载使用:仅针对动态链接生成的程序
使用注意事项:
1.库文件必须放在指定路径下:/usr/lib64 (gcc链接器会 在默认路径下去找对应的库)
2.设置环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/ (设置环境变量 库地址路径为当前路径)
综上:gcc 默认优先选择动态库进行链接,无论是在生成可执行程序以及运行程序时都需要保证库的路径明确(包括放在指定路径下或设置环境变量为当前路径) 但这仅仅是针对动态链接库,如果是静态库比较常用的为-L选项进行链接