• 首页
  • 中国
  • STM32开发笔记61: 解决Undefined symbol ethernetif_init (referred from lwip.

STM32开发笔记61: 解决Undefined symbol ethernetif_init (referred from lwip.

2023-11-01 124浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

单片机型号:STM32F407VGT6

在STM32开发笔记60: 在STM32CubeMX中配置LwIP文章的基础上进行分层设计,将与用户设计相关的文件挑出来单独建立一个工程,此工程使用CPP11进行生成,在链接的时候提示错误。

挑出的与用户逻辑相关的文件如下图所示:

错误如下图所示:

ethernetif_init函数出现在ethernetif.c文件中,代码如下。

err_t ethernetif_init(struct netif *netif)

{

LWIP_ASSERT("netif != NULL", (netif != NULL));

#if LWIP_NETIF_HOSTNAME

/* Initialize interface hostname */

netif->hostname = "lwip";

#endif /* LWIP_NETIF_HOSTNAME */

netif->name[0] = IFNAME0;

netif->name[1] = IFNAME1;

/* We directly use etharp_output() here to save a function call.

* You can instead declare your own function an call etharp_output()

* from it if you have to do some checks before sending (e.g. if link

* is available...) */

#if LWIP_IPV4

#if LWIP_ARP || LWIP_ETHERNET

#if LWIP_ARP

netif->output = etharp_output;

#else

/* The user should write ist own code in low_level_output_arp_off function */

netif->output = low_level_output_arp_off;

#endif /* LWIP_ARP */

#endif /* LWIP_ARP || LWIP_ETHERNET */

#endif /* LWIP_IPV4 */

#if LWIP_IPV6

netif->output_ip6 = ethip6_output;

#endif /* LWIP_IPV6 */

netif->linkoutput = low_level_output;

/* initialize the hardware */

low_level_init(netif);

return ERR_OK;

}

调用函数出现在lwip.c文件的MX_LWIP_Init函数中,调用语句如下:

netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);

可看到ethernetif_init作为参数被netif_add函数调用时,没有带参,这是CPP11所不允许的,所以链接时报错。

解决此问题的方法:

1、不使用CPP11进行编译;

2、将此2个文件(不改变文件的完整性)从C++工程中移出,编译为静态库,再和C++工程进行链接。

我选用第2种方法加以解决,这样不仅可以解决实际问题,而且还可以在逻辑层采用C++进行程序设计。


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台