2

もともとiPhone用に作成されたPirni と呼ばれるこのCプログラムをコンパイルしようとしています.Linux Ubuntu 12.04 LTSで実行したいと思います。これは非常に短いものです (3 つの C ファイルと 1 つのヘッダー ファイル)。しかし、次のエラーが発生します。libpcap-devインストールして含めた-lpcapので、何が問題なのかわかりません。

gcc -Wall -pthread -lpcap pirni.c threads.c sniffer.c -o pirni -lnet
pirni.c: In function ‘set_forwarding’:
pirni.c:31:2: warning: implicit declaration of function ‘sysctlbyname’ [-Wimplicit-function-declaration]
/tmp/cc3sf284.o: In function `set_forwarding':
pirni.c:(.text+0xfd): undefined reference to `sysctlbyname'
/tmp/ccvGjyMo.o: In function `processPacket':
sniffer.c:(.text+0x1b): undefined reference to `pcap_dump'
/tmp/ccvGjyMo.o: In function `initSniffer':
sniffer.c:(.text+0xfa): undefined reference to `pcap_open_live'
sniffer.c:(.text+0x15a): undefined reference to `pcap_lookupnet'
sniffer.c:(.text+0x1af): undefined reference to `pcap_compile'
sniffer.c:(.text+0x1dd): undefined reference to `pcap_setfilter'
sniffer.c:(.text+0x222): undefined reference to `pcap_dump_open'
sniffer.c:(.text+0x27c): undefined reference to `pcap_loop'
collect2: ld returned 1 exit status
make: *** [main] Error 1
4

2 に答える 2

6
gcc -Wall -pthread -lpcap pirni.c threads.c sniffer.c -o pirni -lnet
                   ^^^^^^

それを最後に移動して、リンカーがリンクする必要があるシンボルを認識できるようにします。

コマンドラインにあるライブラリを使用すると、リンカーはこれまでのところ からのシンボルを必要としないことを認識しlibpcap、それを無視します。

于 2012-11-04T23:45:32.647 に答える
6

これ言ってみて:

gcc -Wall -pthread pirni.c threads.c sniffer.c -o pirni -lnet -lpcap
#                                                       ^^^^^^^^^^^^

ライブラリは、ローカル翻訳単位のにリストする必要があります。ldマニュアルにその理由が詳しく説明されています (不足しているシンボルを検索して挿入する方法に関係しています) 。

于 2012-11-04T23:45:50.013 に答える