在 windows 10 上使用 strawberry perl 安装 Net::Pcap
Installing Net::Pcap using strawberry perl on windows 10
我正在尝试使用 portable strawberry Perl v5.28.1 版本安装 Net::Pcap (https://metacpan.org/pod/Net::Pcap),以下是我的步骤:
1.I 从 https://nmap.org/npcap/#download
安装了 npcap(windows 10 的 winpcap)
2.I 从 https://nmap.org/npcap/#download
下载了 npcap SDK
3.I 将 SDK zip 文件夹解压缩到 c:/WdpPack 并验证 Include 和 Lib 文件夹包含头文件和库
4.Then 运行 下面的命令
perl Makefile.PL INC=-IC:/WpdPack/Include "LIBS=-LC:/WpdPack/Lib -lwpcap"
我收到以下错误消息:
socket.h patched... ok
looking for -lwpcap... yes
checking for pcap_lib_version() in -lwpcap... no
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You appear to lack the WinPcap developer pack.
If it is installed in a non-standard location, please try setting the LIBS
and INC values on the command line. For instance, if you have unzipped the
developer's pack in C:\WpdPack, you should execute:
perl Makefile.PL INC=-IC:/WpdPack/Include "LIBS=-LC:/WpdPack/Lib -lwpcap"
Or get and install the WinPcap developer's pack from
http://www.winpcap.org/install/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
知道如何解决这个问题吗?
我能够通过将 SDK 文件夹从 C:\WdpPack
移动到我的 C:\User
文件夹来编译它。我对 Windows 不太熟悉,所以我不确定为什么会这样,也许与权限有关?
更新:
在运行perl Makefile.PL
之后,运行gmake
编译模块失败并报错:
[...]
stubs.inc:91:8: error: redefinition of 'struct pcap_if'
[...]
stubs.inc:267:5: error: conflicting types for 'pcap_compile_nopcap'
[...]
stubs.inc:357:8: error: redefinition of 'struct pcap_rmtauth'
[...]
stubs.inc:363:10: error: conflicting types for 'pcap_open'
[...]
stubs.inc:438:8: error: redefinition of 'struct pcap_send_queue'
[...]
stubs.inc:497:8: error: redefinition of 'struct pcap_samp'
要解决此问题,请编辑文件 stubs.inc
:
删除第 91-97 行
struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};
删除行:267-271
int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask);
int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask) {
FUNCTION_NOT_IMPLEMENTED_ERROR(pcap_compile_nopcap)
return -1;
删除行:357-361
struct pcap_rmtauth {
int type;
char *username;
char *password;
};
删除第 438-442 行:
struct pcap_send_queue{
u_int maxlen;
u_int len;
char *buffer;
};
删除第 519-521 行:
struct pcap_samp {
int method;
int value;
};
现在gmake
编译文件,但链接器失败:
[...]
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x23be): undefined reference to `pcap_geterr'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2580): undefined reference to `pcap_geterr'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2590): undefined reference to `pcap_stats'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2820): undefined reference to `pcap_fileno'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x29c4): undefined reference to `pcap_file'
[...]
这里的问题是我们链接了 32 位库 wpcap.lib
,参见 this post。并且发现文件夹Lib/x64
中SDK中有一个64位版本的库。所以我们必须用正确的库路径重新运行Makefile.PL
:
perl Makefile.PL INC=-IC:/Users/Me/Libraries/npcap/Include "LIBS=-LC:/Users/Me/Libraries/npcap/Lib/x64 -lwpcap"
(更改上述命令中的路径以符合您的 SDK 安装目录)然后重新运行 gmake
.
我正在尝试使用 portable strawberry Perl v5.28.1 版本安装 Net::Pcap (https://metacpan.org/pod/Net::Pcap),以下是我的步骤:
1.I 从 https://nmap.org/npcap/#download
安装了 npcap(windows 10 的 winpcap)2.I 从 https://nmap.org/npcap/#download
下载了 npcap SDK3.I 将 SDK zip 文件夹解压缩到 c:/WdpPack 并验证 Include 和 Lib 文件夹包含头文件和库
4.Then 运行 下面的命令
perl Makefile.PL INC=-IC:/WpdPack/Include "LIBS=-LC:/WpdPack/Lib -lwpcap"
我收到以下错误消息:
socket.h patched... ok
looking for -lwpcap... yes
checking for pcap_lib_version() in -lwpcap... no
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You appear to lack the WinPcap developer pack.
If it is installed in a non-standard location, please try setting the LIBS
and INC values on the command line. For instance, if you have unzipped the
developer's pack in C:\WpdPack, you should execute:
perl Makefile.PL INC=-IC:/WpdPack/Include "LIBS=-LC:/WpdPack/Lib -lwpcap"
Or get and install the WinPcap developer's pack from
http://www.winpcap.org/install/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
知道如何解决这个问题吗?
我能够通过将 SDK 文件夹从 C:\WdpPack
移动到我的 C:\User
文件夹来编译它。我对 Windows 不太熟悉,所以我不确定为什么会这样,也许与权限有关?
更新:
在运行perl Makefile.PL
之后,运行gmake
编译模块失败并报错:
[...]
stubs.inc:91:8: error: redefinition of 'struct pcap_if'
[...]
stubs.inc:267:5: error: conflicting types for 'pcap_compile_nopcap'
[...]
stubs.inc:357:8: error: redefinition of 'struct pcap_rmtauth'
[...]
stubs.inc:363:10: error: conflicting types for 'pcap_open'
[...]
stubs.inc:438:8: error: redefinition of 'struct pcap_send_queue'
[...]
stubs.inc:497:8: error: redefinition of 'struct pcap_samp'
要解决此问题,请编辑文件 stubs.inc
:
删除第 91-97 行
struct pcap_if { struct pcap_if *next; char *name; /* name to hand to "pcap_open_live()" */ char *description; /* textual description of interface, or NULL */ struct pcap_addr *addresses; bpf_u_int32 flags; /* PCAP_IF_ interface flags */ };
删除行:267-271
int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask); int pcap_compile_nopcap(int snaplen, int linktype, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask) { FUNCTION_NOT_IMPLEMENTED_ERROR(pcap_compile_nopcap) return -1;
删除行:357-361
struct pcap_rmtauth { int type; char *username; char *password; };
删除第 438-442 行:
struct pcap_send_queue{ u_int maxlen; u_int len; char *buffer; };
删除第 519-521 行:
struct pcap_samp { int method; int value; };
现在gmake
编译文件,但链接器失败:
[...]
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x23be): undefined reference to `pcap_geterr'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2580): undefined reference to `pcap_geterr'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2590): undefined reference to `pcap_stats'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x2820): undefined reference to `pcap_fileno'
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Pcap.o:Pcap.c:(.text+0x29c4): undefined reference to `pcap_file'
[...]
这里的问题是我们链接了 32 位库 wpcap.lib
,参见 this post。并且发现文件夹Lib/x64
中SDK中有一个64位版本的库。所以我们必须用正确的库路径重新运行Makefile.PL
:
perl Makefile.PL INC=-IC:/Users/Me/Libraries/npcap/Include "LIBS=-LC:/Users/Me/Libraries/npcap/Lib/x64 -lwpcap"
(更改上述命令中的路径以符合您的 SDK 安装目录)然后重新运行 gmake
.