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

KEIL MDK吐槽

[复制链接]
qianfan 发布时间:2015-3-3 13:26
本帖最后由 QianFan 于 2015-3-3 14:42 编辑 % N  @% Q9 V5 t, o) Z' A( C' a
; i0 b  A% _$ B' f6 U6 ]) n" K. c
    今天使用keil mdk编译工程,工程中有多个源文件,还是采用Arduino的软件结构。  V- h' V2 [: }. t* N" E9 c
    后来发现像一些GUI的库都是使用C进行编写的,在*.c文件中是不能来调用C++的函数的,只好对部分函数重新编写C的实现。
3 n4 ~# Q  G7 K1 s- B    比较常用的是SPI,在Arduino中,有一个叫SPI.cpp的源文件负责SPI通信,先从SPI来编写C语言实现。首先想到的文件名字是SPI.c。这样工程中就有这么两个文件SPI.cpp和SPI.c,但是编译的时候出现了错误,看控制台的输出错误内容大部分都是找不到SPI.c文件中的函数(全部使用extern "C"),明明已经添加进去了,为什么没有参加链接呢?
/ o* j( I0 G: H9 r& u9 W    好好地看控制台的输出,发现有一个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,虽然更名了,但是并没有参与到最后的链接中。这也就是导致最后找不到函数实现错误的根源。
% f- X  K1 l7 d$ H( {* {7 W    其实,当初在进行移植Arduino的时候,发现Arduino为生成的.o文件命名的方式特别奇葩,举个例子来说,还是这个SPI.cpp,Arduino将它生成的.o文件命名为SPI.cpp.o,如果是SPI.c,那么就是SPI.c.o。一开始对这个奇葩的命名方式不是很理解,认为这个纯属蛋疼,现在终于明白了。  M4 u  {4 o7 i6 R; y
    希望使用mdk的人不要栽在这个地方。3 c1 z" ]1 b; b, b! s. V
# E9 _* _- d) D- Z& S8 d
' r1 v7 x" N* T7 N" p# H
    ARM公司的处理效率真高,今天中午大约十点的时候将这个问题提交到了KEIL官网,就在刚才北京的售后打来电话询问情况(可能是我在KEIL官网用英文提交的内容太菜了,他们看不懂吧)。真不好意思说我用的是破解的。。。
; h# u2 O+ [3 q/ L0 e   
$ x9 e0 C' K% H( g3 g2 o
赞 收藏 1 评论21 发布时间:2015-3-3 13:26

举报

21个回答
Mandelbrot_Set 回答时间:2015-3-3 16:19:02
试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
) I2 \6 _$ f: w/ |  M5 B----------------------------------------------------------------------------------------0 x) ~$ v4 M+ e/ i% t0 t& u9 J" M
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")) f5 Z" ^  [' _" t
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"); T0 O; i3 D3 b* Q) C: t( k/ [
感觉MDK这个依赖关系生成的就不科学...
qianfan 回答时间:2015-3-3 18:06:55
安 发表于 2015-3-3 16:36
% N$ q0 Q" ]6 z  T! b4 ^谢谢楼主分享,平时只使用.C,没有发生过类似的问题,这个可以作为借鉴,帮助他人解决问题。 ...

; g( U, ]- J) J! D; X像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回到C语言。1 U5 H2 o* U' D3 `6 @; G
期待什么时候OS,GUI能够出一份C++的库来使用。
qianfan 回答时间:2015-3-3 18:05:06
Mandelbrot_Set 发表于 2015-3-3 16:19
4 ^& ~, b( B; ]' [9 a  M8 n# k. b试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
$ t  a& }! r9 P9 W* |4 \) v--------------------- ...

1 J1 R, D+ ]! G0 V8 }$ a两个生成的名字都是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
沐紫 发表于 2015-3-3 17:53
- E# }! [6 H9 S& g) F* J感谢楼主
; |( s6 D4 [% x5 R9 u" u
感谢沐紫姐参与
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! {/ w4 p& s& U4 E9 {$ \! I
两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的dela ...

6 O- K' P1 B! ]6 _+ P好像跟添加顺序有关,好像跟.dep列出的先后顺序有关.
废鱼 回答时间:2015-3-4 09:16:29
QianFan 发表于 2015-3-3 18:06
; d# Q7 h* L# ]! i像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...
" [! o; h8 }4 F2 I
会的,慢慢都会改变的。
feel-376797 回答时间:2015-3-4 09:23:51
谢谢分享
Mandelbrot_Set 回答时间:2015-3-4 09:36:18
QianFan 发表于 2015-3-3 18:06/ e' K6 N7 C; d' }
像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...
' d7 U" I8 Z  B
github上还是可以找到一可供参考的东西的.
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版