• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数

人工智能 better_coder 2104次浏览 0个评论

问题描述

今天在上嵌入式课时候又学习到了新知识哈,美滋滋~ 情况是这样的,我在STM32F429上跑RT-Thread系统,因为rtt系统里面既有.cpp文件又有.c函数(keil5以上就支持.cpp和.c在同一个工程中共存了),所以当我需要在.c文件里面调用.cpp文件里面的函数的时候就报了下面这个错误,可以看到工程在编译的时候没有问题,但是在链接(linking)的时候报了这个错误,说明工程的问题出现在了链接上,那也就是说单个.cpp和单个.c文件里面是没有语法错误(强烈建议各位程序猿本着消除所有warning的初心敲代码哦):   L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数  


原因

这是语法错误造成的,.cpp和.c文件编译的方式其实是不一样的,自然在编译之后不能顺利链接起来==,毕竟是面向过程和面向对象的两种语言,所以我们就需要在代码里面做一些小手术啦~  

解决办法

可以看到在epos_keyboard.c里面调用了key_lcd()这个函数L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数但是key_lcd()这个函数其实是在 .cpp文件里面定义的哦L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数所以这就导致了前文中出现的链接错误,那么接下来我们来看看 解决办法吧~  

extern int key_lcd(int);//加在调用函数的前面
extern "C" int key_lcd(int);//加在函数定义体的前面

L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数
L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数最后可以看到问题完美的解决啦~
L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数  


刨根问底

那么为什么作为底层的芯片里面会用执行效率并不高的C++语言呢?明明C语言的执行效率更高呀!  

于是我就去查阅了资料,发现了各中原因。   其实主要是C++语言不但兼容了C语言,而且提供了类的抽象特性,这使得其在嵌入式行业也是有了一席之地。大家想,随着嵌入式操作系统的不断庞大,其系统的代码量肯定也是会不断增加的,那么纯粹的使用C语言来进行维护和撰写的话就会显得系统有些臃肿,这时候不但可以兼容C语言,而且可以提供抽象的C++则成为了嵌入式操作系统的好帮手,这也是我们为什么要从语法角度上学习将这2门语言结合起来的原因。  


总结

C++和C语言在嵌入式领域的配合会越来越普遍,所以如何将C++文件和C文件放到在同一个工程中使也是一个非常重要的知识点哦~


                                               (づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧

L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明L6218E: Undefined symbol的一种解决办法——Keil5工程中.c文件和.cpp文件互相调用函数
喜欢 (0)

您必须 登录 才能发表评论!

加载中……