基于wireshark-nfc示例编译Wireshark插件版本不兼容报错如何解决
Wireshark NFC插件版本不兼容问题排查与解决
根因定位
你当前的代码混淆了插件自身版本和Wireshark依赖版本的宏定义,手动硬编码的WIRESHARK_VERSION_MAJOR、WIRESHARK_VERSION_MINOR值和你本地运行的Wireshark版本不匹配,触发了插件加载时的版本校验规则,才会弹出如下错误:
插件'nfc-wireshark.so'是为Wireshark 3.3版本编译的
排查步骤
- 执行命令
wireshark -v确认本地运行的Wireshark完整版本号,记录主版本、次版本、微版本三个字段 - 检查编译环境安装的Wireshark开发包版本,确认和运行的Wireshark版本完全一致,否则会出现编译时版本和运行时版本不匹配的问题
修复方案
- 删除代码中错误的版本宏定义,原有三行硬编码的版本宏全部删掉:
// 删掉以下3行 #define VERSION "0.8.0" #define WIRESHARK_VERSION_MAJOR "0.8.0" #define WIRESHARK_VERSION_MINOR "0.8.0"
- 引入Wireshark官方头文件的版本宏,区分插件自身版本和依赖的Wireshark版本:
// 新增Wireshark版本头文件引用 #include <wireshark/version.h> // 单独定义插件自身的版本号,不要和Wireshark版本宏混用 #define PLUGIN_VERSION "0.8.0" #ifndef ENABLE_STATIC // 插件自身版本用自定义的PLUGIN_VERSION G_MODULE_EXPORT const gchar plugin_version[] = PLUGIN_VERSION; // Wireshark兼容性校验的版本直接用头文件自带的宏,不要手动写死 G_MODULE_EXPORT const gchar plugin_want_major[] = VERSION_MAJOR; G_MODULE_EXPORT const gchar plugin_want_minor[] = VERSION_MINOR; // 3.0以上版本的Wireshark还需要补充微版本校验,新增下面一行 G_MODULE_EXPORT const gchar plugin_want_micro[] = VERSION_MICRO; // 后续的插件注册逻辑保持不变即可 G_MODULE_EXPORT void plugin_register(void) { extern void proto_register_llcp(void); extern void proto_register_snep(void); extern void proto_register_ndef(void); proto_register_llcp(); proto_register_ndef(); proto_register_snep(); } G_MODULE_EXPORT void plugin_reg_handoff(void) { extern void proto_reg_handoff_llcp(void); extern void proto_reg_handoff_snep(void); extern void proto_reg_handoff_ndep(void); proto_reg_handoff_llcp(); proto_reg_handoff_snep(); proto_reg_handoff_ndef(); } #endif
- 重新编译插件后重新加载到Wireshark即可解决版本不兼容问题。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

