从零开始学Linux之gcc链接

目录

创建静态库并使用

创建动态库(共享库)并使用


链接:将.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的文件类型,是executabledynamically 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文件的目录添加到该文件

从零开始学Linux之gcc链接_第1张图片

使用ldconfig命令使配置生效,然后就能成功运行可执行文件

你可能感兴趣的:(linux,运维,服务器)