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

单片机型号:STM32F407VGT6


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

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

STM32开发笔记61: 解决Undefined symbol ethernetif_init (referred from lwip.o).问题_第1张图片

错误如下图所示:

STM32开发笔记61: 解决Undefined symbol ethernetif_init (referred from lwip.o).问题_第2张图片

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++进行程序设计。

 

 

 

原创性文章,转载请注明出处      

CSDN:http://blog.csdn.net/qingwufeiyang12346

 

 

 

 

你可能感兴趣的:(#,STM32快速开发,STM32快速开发)