目录
创建静态库并使用
创建动态库(共享库)并使用
链接:将.o目标文件链接起来生成一个可执行程序文件,可分为静态链接和动态链接
静态链接:链接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,一旦链接成功就可独立运行,生成的可执行文件不再需要任何静态库文件的支持就可以独立运行。缺点是如果所使用的静态库发生更新改变,就需要必须重新编译。
动态链接:不会直接将该函数的代码拷贝到文件中,而是将函数的位置信息记录到文件中,然后生成可执行文件。这样生成的可执行文件是无法独立运行的,但是可执行文件中记录了所需功能函数的位置信息,所以也可以成功运行。如果该动态链接库不存在了该可执行文件就无法运行。动态库的代码只有程序执行的时候才会加入到可执行文件,优点就是用户更新了动态库不需要重新编译,缺点是可移植性差,无法独立运行,必须借助相应的库文件。
gcc的其他具体过程可以看我上次发的博客
https://blog.csdn.net/m0_62574258/article/details/135956002?spm=1001.2014.3001.5501
创建静态库并使用
静态库文件是一组相关的目标文件的集合,以及用于链接这些目标文件的元数据。ar命令可以将目标文件打包成一个静态库文件,也可以从静态库文件中提取目标文件。
先将test.c源文件转换成test.o目标文件
gcc -c test.c
新建打包文件libtest.a(静态库),然后将test.o目标文件添加到该包文件
ar -rcsv libtest.a test.o
-r 添加文件到打包文件中
-c 新建打包文件
-s 生成打包文件的符号表
-v 显示运行的完整信息
-d 删除打包文件中的文件
在程序中链接静态库,使用-static选项
gcc test.c -static -o hello.static -L. -lhello
直接编译main.c发现缺少hello函数,hello函数定义在hello.c文件中
把hello.c编译成hello.o目标文件
将hello.o目标文件打包进静态函数libhello.a
将main.c与静态函数libhello.a链接生成静态可执行文件main.static
gcc -static -o hello.static -L. -lhello
加上选项-static,使用-L指定函数库路径,这里-L.表示函数在当前目录,-l指定函数,需要把前面的lib去掉,如库函数叫libhello.a。只需要-lhello
运行该可执行文件
查看main.static的文件类型,是statically linked,即静态链接可执行文件
创建动态库(共享库)并使用
gcc -c -fPIC hello.c
使用-fPIC选项编译的.o文件会生成位置无关的代码
gcc -shared hello.o -o libhello.so
使用-shared选项把目标文件变成动态文件库
在程序中链接动态库
gcc main.c -L. -lhello -o main
使用-fPIC选项编译.o文件
gcc -c -fPIC hello.c
使用-shared选项把目标文件变成动态文件库
gcc -share hello.o libhello.so
将main.c与动态函数libhello.so链接生成动态可执行文件main,不指定static默认为动态链接
gcc main.c -L. -lhello -o main
查看main的文件类型,是executable且dynamically linked,即动态链接可执行文件
运行程序发现无法运行,无法打开共享文件,因为程序在运行时,会在/usr/lib找需要的动态库文件,若找到则载入动态库,否则将提示类似上述错误而终止程序运行,有三种解决方法
方法1:将libhello.so文件复制到/usr/lib目录下
成功运行,如果把/usr/lib目录下的libhello.so文件删掉该程序就不能运行
方法2:配置环境变量LD_LIBRARY_PATH
将动态库的路径添加到环境变量LD_LIBRARY_PATH中
方法3: 修改/etc/ld.so.conf配置文件
把libhello.so文件的目录添加到该文件
使用ldconfig命令使配置生效,然后就能成功运行可执行文件