我写了这段代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <linux/types.h>
#include <linux/netfilter.h>
#include <libnetfilter_queue/libnetfilter_queue.h>
int main(int argc, char **argv)
{
struct nfq_handle *h;
printf("opening library handle\n");
h = nfq_open();
nfq_close(h);
exit(0);
}
当我尝试编译它时说:
/tmp/ccEv9MYS.o: In function `main':
test1.c:(.text+0x1a): undefined reference to `nfq_open'
test1.c:(.text+0x2a): undefined reference to `nfq_close'
collect2: ld returned 1 exit status
我尝试检查gcc是否找到了库,并且它是(当我修改libnetfilter_queue的包含时出现错误),我重新编译了库并使得我正在调用的函数在其中。< / p>
如果你有任何线索感谢帮助
使用此编译:
gcc -o test test1.c
我也尝试过:
gcc -o test -lnetfilter_queue test1.c
gcc -o test -L/usr/local/lib test1.c
答案 0 :(得分:3)
嗯,从gcc
manual page开始,-llibrary
链接选项
在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,'foo.o -lz bar.o'在文件foo.o之后但在bar.o之前搜索库'z'。如果bar.o引用'z'中的函数,则可能无法加载这些函数。
也就是说,链接器从左到右工作,因此需要将依赖项放在左侧。
您需要将编译语句更改为
gcc -o test test1.c -lnetfilter_queue