【发布时间】:2015-04-24 04:57:00
【问题描述】:
我当前对 SDK 的制作有一个错误,指出 wan_name 未在 linux-2.6.21/net/netfilter/nf_conntrack_core.c 中声明。
在nf_conntrack_core.c中声明为extern
我正在根据我的要求重新配置 Linux 内核。
在跟踪 wan_name 变量时,我发现它已在 linux-2.6.21/net/ipv4/ip_tables.c 中声明和使用,并且还声明了 extern 并在 linux2.6.21/net/ipv4/ip_conntrack_core.c 中使用
所以就像wan_name 在.c 文件内的net/ipv4/ 目录中声明,并被同一目录中的其他.c 文件用作extern。但是net/netfilter/ 目录.c 文件想要访问该变量。
这可能吗?
修复此错误的最佳解决方案是什么??
据我所知,extern 允许您访问在同一目录.c 文件中声明的全局变量。如果其他目录.c 文件想要访问该变量怎么办。
有什么想法吗?
【问题讨论】:
-
全局变量是定义在其他目录还是同一个目录都没有关系。如果编译单元中的
extern变量声明与相同或不同编译单元中具有完全相同类型的定义匹配,则链接时,它将链接。 (1) 所以你需要检查声明和定义的类型是否完全匹配。 (2) 模块nf_conntrack_core是否与模块ip_tables链接。如果没有,您将看到链接器错误。 -
是的。此错误是链接错误。所以 extern 关键字对于不同目录中的全局变量是不够的。
net/built-in.o: In function 'nf_conntrack_in' : undefined reference to 'wan_name'是准确的错误行。 iptables 的链接可能晚于 netfilter 模块目标文件,因此出现此错误或类似情况。
标签: c linux linux-kernel