安装GeoIP2以及利用GeoIP2的API开发查询函数 踩过的雷——程序编译链接运行篇

来源:互联网 发布:淘宝好看的小白鞋 编辑:程序博客网 时间:2024/06/18 09:45

接上一篇,忘记把代码贴出来了……一会补上吧。

程序是写好了,但是折腾了好久,首先是"undefined reference to MMDB_open"等等这一系列的用的GeoLite API出现的错误,我本来以为是头文件的问题,但是查了一下linux下头文件的查询顺序是/lib /usr/lib /usr/local/lib 我在/usr/local/lib下其实是有这个需要引用的头文件的,并且我的头文件也在代码里头include了。

但是其实要注意一点 undefined reference是未引用而不是未定义,所以其实不是头文件的问题而是链接库的问题,就是程序在链接的时候找不到这个函数的实现了。我们使用的额外的库是libmaxminddb.so这一系列的,所以在gcc编译的时候加上这个库名就行了,这个库名要把前面的lib去掉并且把后缀.so或者.a去掉,比如说libmaxminddb.so,他的库名就是maxminddb,加上这个库名呢要用-l再无缝隙直接加上库名。为什么其他的不用加上库名只有这个用呢,可能其他是默认的吧啥的,我们这里这个库不是常用库所以要声明一下我们用到了这个库,不然啥库都给你链接上多累啊。

使用示例:

gcc geoip.c -lmaxminddb

geoip.c是我们的代码文件。

之后要声明一下-L 用法,这个就是不在/lib /usr/lib /usr/local/lib下的库的时候,你还想链接上它,就要用这个选项了,-L后面直接无缝加上那个库的路径即可。

再推荐一篇文章吧,这个讲了-l -L还是挺好的,请点击这里。


ok,我们在gcc一下,然后出现了类似于“error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory”这样的错误,我就心想,马格吉,这个我还能用-l指明吗,这个看这跟动态链接库似像非像的。然后自己鼓捣了半天吧,没啥用,上百度搜了一下这个错误,还真有。推荐http://blog.csdn.net/sahusoft/article/details/7388617这篇文章。

这篇文章告诉我们这个是一个共享库文件,我们已经安装了这个共享库文件,但是“已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.”。然后那篇文章说如果安装到了/lib /usr/lib下面的话,使用ldconfig命令即可。

ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.

然而大部分是安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig


还有另外一种其他的情况,那篇文章也提到了,我也就不赘述了。反正有的时候有错误吧,自己去理解错误的意思是很重要的,但是也要知道学会搜索错误的重要性。

阅读全文
0 0
原创粉丝点击