你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

KEIL MDK吐槽

[复制链接]
qianfan 发布时间:2015-3-3 13:26
本帖最后由 QianFan 于 2015-3-3 14:42 编辑

    今天使用keil mdk编译工程,工程中有多个源文件,还是采用Arduino的软件结构。
    后来发现像一些GUI的库都是使用C进行编写的,在*.c文件中是不能来调用C++的函数的,只好对部分函数重新编写C的实现。
    比较常用的是SPI,在Arduino中,有一个叫SPI.cpp的源文件负责SPI通信,先从SPI来编写C语言实现。首先想到的文件名字是SPI.c。这样工程中就有这么两个文件SPI.cpp和SPI.c,但是编译的时候出现了错误,看控制台的输出错误内容大部分都是找不到SPI.c文件中的函数(全部使用extern "C"),明明已经添加进去了,为什么没有参加链接呢?
    好好地看控制台的输出,发现有一个waring,大概的意思是工程中出现了一个spi_1.o,并且已经被忽略了。如果你之前玩过GCC,或者知道编译的整个过程,那么你一定对这个*.o文件比较熟悉。好了,现在问题已经找到了,在mdk中,虽然SPI.cpp和SPI.c是不同的文件,但是在编译生成中间文件的时候,生成的都是SPI.o文件。mdk发现两个文件的名字是相同的,发出了一个警告,说有相同的.o文件,并且已经自动忽略了其中一个(实践证明是忽略了SPI.c生成的SPI.o),并且将SPI.c生成的SPI.o更名成为spi_1.o,虽然更名了,但是并没有参与到最后的链接中。这也就是导致最后找不到函数实现错误的根源。
    其实,当初在进行移植Arduino的时候,发现Arduino为生成的.o文件命名的方式特别奇葩,举个例子来说,还是这个SPI.cpp,Arduino将它生成的.o文件命名为SPI.cpp.o,如果是SPI.c,那么就是SPI.c.o。一开始对这个奇葩的命名方式不是很理解,认为这个纯属蛋疼,现在终于明白了。
    希望使用mdk的人不要栽在这个地方。


    ARM公司的处理效率真高,今天中午大约十点的时候将这个问题提交到了KEIL官网,就在刚才北京的售后打来电话询问情况(可能是我在KEIL官网用英文提交的内容太菜了,他们看不懂吧)。真不好意思说我用的是破解的。。。
   
收藏 1 评论21 发布时间:2015-3-3 13:26

举报

21个回答
Mandelbrot_Set 回答时间:2015-3-3 16:19:02
试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
----------------------------------------------------------------------------------------
F (.\source\delay.c)(0x54B60973)(-c --cpu Cortex-M0 -D__MICROLIB -g -O0 --apcs=interwork -I. -I..\Common\inc -I.\source\oled -I..\PROJ -I.\source -I D:\Keil\ARM\RV31\Inc -I D:\Keil\ARM\CMSIS\Include -I D:\Keil\ARM\Inc\NXP\LPC11xx -o ".\Obj\delay.o" --omf_browse ".\Obj\delay.crf" --depend ".\Obj\delay.d")
F (.\source\delay.cpp)(0x54F56653)(--cpp -c --cpu Cortex-M0 -D__MICROLIB -g -O0 --apcs=interwork -I. -I..\Common\inc -I.\source\oled -I..\PROJ -I.\source -I D:\Keil\ARM\RV31\Inc -I D:\Keil\ARM\CMSIS\Include -I D:\Keil\ARM\Inc\NXP\LPC11xx -o ".\Obj\delay.o" --omf_browse ".\Obj\delay.crf" --depend ".\Obj\delay.d")
感觉MDK这个依赖关系生成的就不科学...
qianfan 回答时间:2015-3-3 18:06:55
安 发表于 2015-3-3 16:36
谢谢楼主分享,平时只使用.C,没有发生过类似的问题,这个可以作为借鉴,帮助他人解决问题。 ...

像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回到C语言。
期待什么时候OS,GUI能够出一份C++的库来使用。
qianfan 回答时间:2015-3-3 18:05:06
Mandelbrot_Set 发表于 2015-3-3 16:19
试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
--------------------- ...

两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的delay.o?
废鱼 回答时间:2015-3-3 16:36:45
谢谢楼主分享,平时只使用.C,没有发生过类似的问题,这个可以作为借鉴,帮助他人解决问题。
沐紫 回答时间:2015-3-3 17:53:28
感谢楼主
qianfan 回答时间:2015-3-3 18:07:12

感谢沐紫姐参与
lkl0305 回答时间:2015-3-3 20:32:22
多谢分享
wamcncn 回答时间:2015-3-4 07:41:53
谢谢分享
拼命三郎 回答时间:2015-3-4 08:42:25
xxxx.png
拼命三郎 回答时间:2015-3-4 08:43:24
ddddd.png
Mandelbrot_Set 回答时间:2015-3-4 09:15:25
QianFan 发表于 2015-3-3 18:05
两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的dela ...

好像跟添加顺序有关,好像跟.dep列出的先后顺序有关.
废鱼 回答时间:2015-3-4 09:16:29
QianFan 发表于 2015-3-3 18:06
像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...

会的,慢慢都会改变的。
feel-376797 回答时间:2015-3-4 09:23:51
谢谢分享
Mandelbrot_Set 回答时间:2015-3-4 09:36:18
QianFan 发表于 2015-3-3 18:06
像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...

github上还是可以找到一可供参考的东西的.
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版