2014-12-17 1 views
2

Я сочинительство этот код:Netfilter очередь неопределенная ссылка на `nfq_open»

#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, есть ошибка), я перекомпилировал библиотеку и сделал вывод о том, что в нее входят функции, которые я вызываю.

Если у вас есть какие-либо подсказки, спасибо за помощь

Icompile с помощью этого:

gcc -o test test1.c 

Я также пробовал:

gcc -o test -lnetfilter_queue test1.c 
gcc -o test -L/usr/local/lib test1.c 
+0

Netfilter тег для netfilter_queue (кстати, этот тег не хватает), и я положил его в случае, если кто-то была такая же проблема, но я думаю, что это более общая проблема – user1928596

+0

, пожалуйста, покажите свое заявление о компиляции. –

+0

спасибо за указание, что вне (я отредактировал мой пост, чтобы включить его) – user1928596

ответ

3

Ну, из gccmanual page, для -llibrary связывания опция

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, «foo.o -lz bar.o» ищет библиотеку «z» после файла foo.o, но до bar.o. Если bar.o относится к функциям в 'z', эти функции могут не загружаться.

Это говорит о том, что компоновщик работает слева направо, поэтому нужно поместить зависимую с левой стороны.

Вы должны изменить свой сборник заявление

gcc -o test test1.c -lnetfilter_queue