编译TLDK遇‘解引用指向不完整类型的指针’错误,是否为源码问题?
编译TLDK时出现“解引用指向不完整类型的指针”错误排查
问题描述
编译TLDK时触发“解引用指向不完整类型的指针”错误,严格按照官方安装说明执行编译操作仍无法解决。
环境信息
- 系统版本:Debian 10.2
- Linux内核版本:4.19.249-2
- GCC版本:8.3.0
- Make版本:4.2.1
- DPDK版本:18.11.11(环境变量已配置)
错误日志
In file included from /root/tldk/lib/libtle_l4p/ctx.c:23: /root/tldk/lib/libtle_l4p/stream.h: In function ‘stream_get_dest’: /root/tldk/lib/libtle_l4p/stream.h:156:6: error: dereferencing pointer to incomplete type ‘struct rte_ipv4_hdr’ l3h->src_addr = dev->prm.local_addr4.s_addr; ^~ /root/tldk/lib/libtle_l4p/stream.h:161:17: error: dereferencing pointer to incomplete type ‘struct rte_ipv6_hdr’ rte_memcpy(l3h->src_addr, &dev->prm.local_addr6, ^~ In file included from /root/tldk/lib/libtle_l4p/ctx.c:24: /root/tldk/lib/libtle_l4p/misc.h: At top level: /root/tldk/lib/libtle_l4p/misc.h:210:32: warning: ‘struct rte_ipv4_hdr’ declared inside parameter list will not be visible outside of this definition or declaration _ipv4x_phdr_cksum(const struct rte_ipv4_hdr *ipv4_hdr, size_t ipv4h_len, ^~~~~~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h: In function ‘_ipv4x_phdr_cksum’: /root/tldk/lib/libtle_l4p/misc.h:215:15: error: dereferencing pointer to incomplete type ‘const struct rte_ipv4_hdr’ s0 = ipv4_hdr->src_addr; ^~ /root/tldk/lib/libtle_l4p/misc.h: At top level: /root/tldk/lib/libtle_l4p/misc.h:246:15: warning: ‘struct rte_ipv4_hdr’ declared inside parameter list will not be visible outside of this definition or declaration const struct rte_ipv4_hdr *ipv4_hdr) ^~~~~~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h: In function ‘_ipv4_udptcp_mbuf_cksum’: /root/tldk/lib/libtle_l4p/misc.h:250:28: warning: passing argument 1 of ‘_ipv4x_phdr_cksum’ from incompatible pointer type [-Wincompatible-pointer-types] cksum = _ipv4x_phdr_cksum(ipv4_hdr, mb->l3_len, 0); ^~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h:210:46: note: expected ‘const struct rte_ipv4_hdr *’ but argument is of type ‘const struct rte_ipv4_hdr *’ _ipv4x_phdr_cksum(const struct rte_ipv4_hdr *ipv4_hdr, size_t ipv4h_len, ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h: At top level: /root/tldk/lib/libtle_l4p/misc.h:270:15: warning: ‘struct rte_ipv6_hdr’ declared inside parameter list will not be visible outside of this definition or declaration const struct rte_ipv6_hdr *ipv6_hdr) ^~~~~~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h: In function ‘_ipv6_udptcp_mbuf_cksum’: /root/tldk/lib/libtle_l4p/misc.h:274:30: warning: passing argument 1 of ‘rte_ipv6_phdr_cksum’ from incompatible pointer type [-Wincompatible-pointer-types] cksum = rte_ipv6_phdr_cksum(ipv6_hdr, 0); ^~~~~~~~ In file included from /root/tldk/lib/libtle_l4p/ctx.c:21: /root/dpdk/x86_64-native-linuxapp-gcc/include/rte_ip.h:390:44: note: expected ‘const struct ipv6_hdr *’ but argument is of type ‘const struct rte_ipv6_hdr *’ rte_ipv6_phdr_cksum(const struct ipv6_hdr *ipv6_hdr, uint64_t ol_flags) ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ In file included from /root/tldk/lib/libtle_l4p/ctx.c:24: /root/tldk/lib/libtle_l4p/misc.h: In function ‘check_pkt_csum’: /root/tldk/lib/libtle_l4p/misc.h:322:44: error: dereferencing pointer to incomplete type ‘const struct rte_ipv4_hdr’ if (fl3 == PKT_RX_IP_CKSUM_UNKNOWN && l3h4->hdr_checksum != 0) { ^~ /root/tldk/lib/libtle_l4p/misc.h:336:39: error: dereferencing pointer to incomplete type ‘const struct rte_udp_hdr’ csum = (proto == IPPROTO_UDP && l4h->dgram_cksum == 0) ? ^~ /root/tldk/lib/libtle_l4p/misc.h:338:28: warning: passing argument 3 of ‘_ipv4_udptcp_mbuf_cksum’ from incompatible pointer type [-Wincompatible-pointer-types] m->l2_len + m->l3_len, l3h4); ^~~~ /root/tldk/lib/libtle_l4p/misc.h:246:29: note: expected ‘const struct rte_ipv4_hdr *’ but argument is of type ‘const struct rte_ipv4_hdr *’ const struct rte_ipv4_hdr *ipv4_hdr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ /root/tldk/lib/libtle_l4p/misc.h:341:28: warning: passing argument 3 of ‘_ipv6_udptcp_mbuf_cksum’ from incompatible pointer type [-Wincompatible-pointer-types] m->l2_len + m->l3_len, l3h6); ^~~~ /root/tldk/lib/libtle_l4p/misc.h:270:29: note: expected ‘const struct rte_ipv6_hdr *’ but argument is of type ‘const struct rte_ipv6_hdr *’ const struct rte_ipv6_hdr *ipv6_hdr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ /root/tldk/lib/libtle_l4p/ctx.c: At top level: cc1: warning: unrecognized command line option ‘-Wno-address-of-packed-member’ make[3]: *** [/root/dpdk/mk/internal/rte.compile-pre.mk:116: ctx.o] Error 1 make[2]: *** [/root/tldk/mk/tle.lib.mk:27: all] Error 2 make[1]: *** [/root/tldk/mk/tle.subdir.mk:23: libtle_l4p] Error 2 make: *** [Makefile:44: lib] Error 2
问题分析与解答
这个错误确实和TLDK源代码的兼容性问题直接相关,核心原因是TLDK代码与你使用的DPDK 18.11.11版本不匹配:
结构体命名差异:
你使用的DPDK 18.11.11中,IP/UDP头部结构体命名为struct ipv4_hdr、struct ipv6_hdr、struct udp_hdr;但TLDK代码中使用的是带rte_前缀的struct rte_ipv4_hdr、struct rte_ipv6_hdr、struct rte_udp_hdr——这类带前缀的命名是DPDK较新版本才引入的规范,TLDK代码适配的是新DPDK版本,和18.11 LTS版本不兼容。头文件引用缺失:
报错中的“解引用不完整类型”提示,说明TLDK的stream.h、misc.h等文件没有正确包含DPDK的rte_ip.h、rte_udp.h等头文件,导致编译器无法识别结构体的完整定义,进而无法解析指针的成员访问操作。函数参数类型不兼容:
代码中出现的“指针类型不兼容”警告,也是结构体命名差异导致的,类型不匹配进一步引发了解引用错误。
修复方案
方案一:升级DPDK版本:
更换为TLDK官方推荐的DPDK版本(建议选择20.11或更高的LTS版本),新版本已统一使用带rte_前缀的结构体命名,能直接和TLDK代码兼容。方案二:修改TLDK源代码适配旧DPDK:
- 在
stream.h、misc.h等涉及DPDK结构体的文件顶部,添加必要的头文件引用:#include <rte_ip.h> #include <rte_udp.h> - 全局替换结构体名称:将所有
struct rte_ipv4_hdr替换为struct ipv4_hdr,struct rte_ipv6_hdr替换为struct ipv6_hdr,struct rte_udp_hdr替换为struct udp_hdr。 - 调整
_ipv6_udptcp_mbuf_cksum函数中rte_ipv6_phdr_cksum的调用参数,确保传入的指针类型为struct ipv6_hdr *,匹配DPDK 18.11的函数签名。
- 在
内容的提问来源于stack exchange,提问作者Logan Ren
相关产品推荐
相关产品推荐

