现一个开源社区非常让人郁闷的问题,内核版本的升级过程也将一些类库升级,却不能向前兼容。
Linux下有名的防火墙iptables/netfilter就存在这样的问题,结构体sk_buff在2.6版本内核升级中进行了修改,但网上大多资料还是关于以前版本的,这都不是主要问题,我觉
得主要问题是将引起用户编写的软件不能通用,鬼知道将要部署的服务器linux内核版本是多少啊。
当然,一批优秀的人将包过滤模块从内核态迁移到用户态编写程序,使用libipq和ip_queue等实现,这样能够极大的方便用户代码的调试,不然在内核中写程序,调试时出现一>点错误可能就死机了。不得不暴力重启看log...
回到正题,最初我以为libipq已经能够很好的解决我的问题了,没想到使用libipq编写代码会出现: field 'in' has incomplete type, 着实让人郁闷,最初还以为是linux/in.h头文件没有被保护到程序中,使用#define __KERNEL明确的开启选项后依然不行,这都不是重点,重点是2.6.14以后的内核版本好像出了一个新的库代替此功能,不清楚是原先
库德升级还是新德库,反正就是应该用libnetfilter_queue,而不应该使用libipq
于是很自然的来到网站:http://netfilter.org/projects/libnetfilter_queue/
网站提供libnetfilter_queue的download,并且指出依赖libnfnetlink,幸运的是网站也提供了libnfnetlink的download,于是赶紧下载下来开始安装,首先是libnfnetlink,
tar -jxvf *.tar.bz2解压,然后 ./configure & make, 安装成功。好像很顺利的样子,赶紧继续安装libnetfilter_queue.
使用同样的方法解压,然后./configure,出现以下问题:
configure: error: Cannot find libnfnetlink >= 0.0.41
郁闷了,不是刚刚已经成功安装libnfnetlink了吗?这可如何是好啊。于是网上查了部分资料,有人提到通过 pkg-config能够解决编译和链接路径不统一的问题。于是网上找了
一篇博客:http://blog.sina.com.cn/s/blog_4b3bae23010081fg.html
博客中提到*.pc配置了编译和链接路径信息。于是手动设置
export PKG_CONFIG_PATH=path, (path路径下面是*.pc)
然后再一次./configure,居然可以了,表示不懂什么原因,有空好好研究以下linux的编译链接机制。
接着就happy的make一下,然后sb了,make出错了:
libnetfilter_queue.c:32:39: fatal error: libnfnetlink/libnfnetlink.h: No such file or directory
然后find一下libnfnetlink.h, NND,只有libnfnetlink的解压目录下面有libnfnetlink.h,所以libnetfilter_queue肯定是找不到了,不过libnfnetlink中make干嘛去了呢?
于是我就特sb的将libnfnetlink 目录下的include下得libnfnetlink目录复制到/usr/include中,继续make,
/usr/bin/ld: cannot find -lnfnetlink
错误变了,换库找不着了,是不是意味着通过了编译,然后找不到库,链接失败.
然后赶紧:
locate libnfnetlink
/usr/lib/libnfnetlink.so.0
/usr/lib/libnfnetlink.so.0.2.0
lib下是存在库德,是不是名字不对呢?试着修改名字:
ln -s /usr/lib/libnfnetlink.so.0 /usr/lib/libnfnetlink.so
然后make,成功了,真是非常优秀啊,下面接下来试试编译libnetfilter_queue测试代码.
[Supplement]
接下来在往上找了一个测试程序,然后使用下列命令编译,
gcc test2.c -lnetfilter_queue
依旧报错,我的那个神啊,能不能又一次没有错得啊~错误如下:
/usr/bin/ld: cannot find -lnetfilter_queue
netfilter_queue库依然找不见,行不行啊,make到底干了啥东西啊~
于是到libnetfilter_queue源目录下找到相关的*.so或者*.a一并考到/usr/lib下。
cp -r libnetfilter_queue-1.0.0/src/.libs/* /usr/lib/
然后再编译,暂时能编译成功,./a.out也能成功运行,接下来还会遇到啥错误呢?