问题
在做项目的时候,我出现了下面的报错:
/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:.
注::后面的路径可以自己设置,. 是指当前路径;而且设置的临时路径下面打开需要重新设置
两种链接库的方式各有各的好处,可以视情况而定。