静态库、动态库

本文详细介绍了在Linux环境下,如何处理编译时出现的未定义引用问题,以及静态库和动态库的创建与链接过程。通过实例演示了生成.o文件、创建静态库(libport.a)和动态库(libport.so)的步骤,并解释了在生成可执行文件时使用-L和-l选项的必要性。最后,提到了动态库的运行时环境变量设置。整个过程对于理解和解决C/C++编程中的链接问题非常有帮助。
摘要由CSDN通过智能技术生成

问题

在做项目的时候,我出现了下面的报错:
/usr/bin/ld: /usr/lib/gcc/arm-linux-gnueabihf/10/…/…/…/arm-linux-gnueabihf/crt1.o: in function _start': (.text+0x34): undefined reference to main’
collect2: error: ld returned 1 exit status
如图:
在这里插入图片描述
这其实是很常见的错误,因为所需要的库函数是自己编写的,在编译运行的时候没有链接我写的库;

解决办法

  • 1.生成.o文件
gcc -c serial-port.c (此.c文件是你运行程序时要链接的库

在这里插入图片描述

  • 2.生成静态库
ar -rcs libport.a *.o

命名规则:lib + 库名 +.a

在这里插入图片描述

  • 3.生成可执行文件
gcc read.c -o read -L. -lport

命名规则:-l + 库名
注意:
-l(小写的l):
指定要链接的库,会到/lib和/usr/lib和/usr/local/lib的系统路径下去找库,显然我们要链接的库在当前路径下,并没有copy到系统路径,故只用-l会报错,要加上-L.
-L: 指定要链接的库的路径,-L. 即为当前路径
在这里插入图片描述
到这一步其实将库链接好了,接下来可以直接执行文件。

  • 4.运行可执行文件文件
./read

在这里插入图片描述

其实这就是静态库链接的全过程。
还有动态库的链接的过程,也总结在下面吧:

  • 1.生成动态库
gcc -shared -fPIC -o libport.so *.o

在这里插入图片描述

  • 2.生成可执行文件
gcc read.c -o read -L. -lport

在这里插入图片描述

  • 3.在环境变量中设置库的临时路径并执行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

注::后面的路径可以自己设置,. 是指当前路径;而且设置的临时路径下面打开需要重新设置

在这里插入图片描述
两种链接库的方式各有各的好处,可以视情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值