得主要問題是將引起用戶編寫的軟件不能通用,鬼知道將要部署的服務器linux內核版本是多少啊。
當然,壹批優秀的人將包過濾模塊從內核態遷移到用戶態編寫程序,使用libipq和ip_queue等實現,這樣能夠極大的方便用戶代碼的調試,不然在內核中寫程序,調試時出現壹>點錯誤可能就死機了。不得不暴力重啟看log...
回到正題,最初我以為libipq已經能夠很好的解決我的問題了,沒想到使用libipq編寫代碼會出現: field 'in' has incomplete type, 著實讓人郁悶,最初還以為是linux/in.h頭文件沒有被保護到程序中,使用#define __KERNEL明確的開啟選項後依然不行,這都不是重點,重點是2.6.14以後的內核版本好像出了壹個新的庫代替此功能,不清楚是原先
庫德升級還是新德庫,反正就是應該用libnetfilter_queue,而不應該使用libipq
於是很自然的來到網站:/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/