链接错误'undefined reference to'与gcc参数 -l -L -I

我们在利用gcc编译程序时经常会出现可恶的 undefined reference to 'xxxxx'错误。首先他不是编译阶段的错误,而是发生在链接时的错误。就是说我们在自己的代码中调用了某个函数,而且也正确的include了相应的头文件,但是却找不到该函数的定义。所以在要对该函数进行链接时会报 undefined reference to 'xxxxx'。
为了解决该错误我们一般可以利用gcc的参数来指定函数库的位置。
我们首先来了解一下gcc与该错误相关的参数的含义:
1. gcc -l  (这里是小写的L)
-l参数用来指定要链接的库,-l参数紧跟“简化的库名”,比如数学库的文件名是libm.so,但是在连接时我们把库文件名的头lib和尾.so去掉得到“简化的库名”m了,所以链接数学库的命令位:gcc -lm。
比如当:gcc -Wall -o medialib medialib.c
时发生:undefined reference to `id3_file_open'错误,我们可以通过修改编译命令来解决该错误:gcc -Wall -o medialib -lid3tag medialib.c
通过添加的参数-lid3tag直接指定要链接的库来编译。
当然
命令gcc -Wall -o medialib -lid3tag medialib.c 编译成功的条件是:libid3tag.so库文件放在
/lib或者/usr/lib或者/usr/local/lib等目录下。否则编译还是错误,这时我们就要用到gcc的另一个编译参数了:
2.gcc -L
-L参数用来指定库文件路径目录名,比如库文件libid3tag.so文件位于/usr/mylib/目录下则我们要将编译命令修改如下: gcc -Wall -o medialib -L/usr/mylib -lid3tag medialib.c 才能编译成功。
3.gcc -I (这里是大写的i)
一般头文件.h位于/usr/include中,当我们库的头文件不再/usr/include中时,我们就要利用gcc -I来指定头文件的目录,比如当我们的头文件放在/usr/headfile目录下,则编译的时候要加上:gcc -I/usr/headfile 才能编译成功。
简单的说: -L指定库文件的目录,-l指定库文件名,-I指定头文件的目录。
4.关于/etc/ld.so.conf
该文件定义了所有可以连接的库文件的目录。
我们用:cat /etc/ld.so.conf命令,
输出如下: include /etc/ld.so.conf.d/*.conf
我们进入:cd /etc/ld.so.conf.d 目录
执行:ls
输出如下: GL.conf   libasound2.conf   libc.conf   i686-linux-gun.conf
执行:cat libc.conf
输出: #libc default configuration
            /usr/local/lib
5.关于文件/etc/ld.so.cache
该文件是“所有可以链接的库文件的目录”的cache文件。
所以当我们修改了/etc/ld.so.conf.d 目录下的文件或者新安装了库文件时,必须更新/etc/ld.so.cache文件。而更新的命令为: sudo ldconfig
6.关于ldconfig
利用ldconfig -p可以输出 所有共享库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值