Linux下C程序动态库的生成和调用

Linux下C程序动态库的生成和调用

1 动态库的打包和调用

下面以一个例子说明。
例如:

编译
编译
动态库封装
编译
动态库封装
链接
链接
main.c
main.o
func1.c
func1.o
libfunc.so
func2.c
func2.o
test

动态库的特点是:一堆目标文件的打包,链接时依赖,运行时依赖。
命令:
gcc -c func1.c func2.c main.c # 生成对应的目标文件, 适用于动态库编译
gcc -shared -fpic -olibfunc.so func1.o func2.o # 动态库打包,-fPIC: 生成与位置无关的代码
gcc main.o -otest -lfunc -L. # 最终链接 -L 指出动态库路径 -l 指出动态库名称

2 静态库打包和调用

编译
编译
静态库封装
编译
静态库封装
链接
链接
main.c
main.o
func1.c
func1.o
libfunc.a
func2.c
func2.o
test

静态库的特点是:一堆目标文件的归档文件,连接时依赖,运行时不依赖。
命令:
gcc -c func1.c func2.c main.c # 生成对应的目标文件
ar -rcs libfunc.a func1.o func2.o # 静态库打包
gcc main.o -otest -lfunc -L. # 最终链接,与动态库的链接方法一样,优先进行动态库链接,可以增加 -static 选项,强制进行静态库链接

3 常用命令

nm 库名: 查看库中函数
ldd EXEC: 查看程序执⾏所需要的动态库

4 gcc 和 g++ 区别

两者都可以编译c++文件,区别在于:
1)不论*.c还是*.cpp, g++都能够在编译时找到c++标准头文件和库文件, 而gcc根据文件后缀名决定是否将c++标准头文件引入
即,一个c++源文件不论是*.c还是*.cpp, 用g++都能够编译成功,而如果一个c++源文件是*.c文件则用gcc编译,则会提示找不到c++标准头文件和库文件。
2)编译的规则不同,对函数名的“翻译”规则不同。

5 编译和链接的理解

1)一个源文件需要调用第三方库文件,在将该文件“编译汇编”(gcc -c)生成目标文件时,只需要第三方库的头文件,在最终生成可执行程序时链接,才需要第三方库的动态库文件(*.so), 即,编译生成目标文件只需要所引用的函数的声明。
2)app需要链接A库,而A库又需要链接B库,则B库只需要链接一次。库只需要链接一次。

猜你喜欢

转载自blog.csdn.net/healingwounds/article/details/84404221
今日推荐