我们在利用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可以输出所有共享库
阅读(4848) | 评论(0) | 转发(0) |