一、库类型
动态函数库: .a后缀
静态函数库: .so后缀
二、使用链接器链接库
1.Linux标准库路径:/lib:/usr/lib
但是,在默认情况下,C链接程序只会在Linux标准库路径下搜索标准C语言库。所以,对于开发者而言,仅仅将非标准C语言库文件放在标准目录中,就希望编译器能够找到它是不够的,库文件必须遵循特定的命名规范并且需要在命令行中明确指定。
2.库文件命名规范
lib + 库名 + .a/.so
3.命令行指定要链接的库,使用示例如下:
(1)指定链接Linux标准库路径下的非标准C语言库(这种情况下,库路径已知,可省略)
gcc -o fred.exe fred.c /usr/lib/libm.a //指定链接静态库
gcc -o fred.exe fred.c -lm //优先链接动态库
(2)指定链接非Linux标准库路径下的非标准C语言库
gcc -o x11fred x11fred.c /usr/openwin/lib/libX11.so //指定链接动态库
gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11 //有限链接动态库
总结:对于Linux标准库路径下的库,我们只需要用-l或者库路径来指明要链接的库;对于非Linux标准库路径下的库,我们需要用-L指明库所在目录,并用-l或者库路径来指明要链接的库。对于用-l或者库路径的区别——-l让链接器优先选择链接同名动态库,库路径使得链接器直接链接库路径指定的库。
三、构建自己的静态库
目标:将bill.c和fred.c打包成一个.a库
工具:ar
步骤:
gcc -c bill.c fred.c //编译不链接,创建bill.o fred.o
ar -crv libfoo.a bill.o fred.o
randlib libfoo.a //为库函数生成一个内容表,Linux下非必须
四、构建自己的动态库
目标:将bill.c和fred.c打包成一个.a库
工具:ar
步骤:
gcc -c bill.c fred.c //编译不链接,创建bill.o fred.o
gcc -shared -o libfoo.so bill.o fred.o
五、编译链接并运行链接到动态链接库的程序
1.gcc -o program program.cpp -L. -lfoo
2.将libfoo.so路径添加到LD_LIBRARY_PATH环境变量,使得program运行时能正确加载到
3. ./program
六、查看可执行程序依赖的动态库
ldd program