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

KEIL MDK吐槽

[复制链接]
qianfan 发布时间:2015-3-3 13:26
本帖最后由 QianFan 于 2015-3-3 14:42 编辑 6 G% l. j1 W! f# G" i

; A* o+ P  G5 u    今天使用keil mdk编译工程,工程中有多个源文件,还是采用Arduino的软件结构。- V# n8 p4 ]8 L( z
    后来发现像一些GUI的库都是使用C进行编写的,在*.c文件中是不能来调用C++的函数的,只好对部分函数重新编写C的实现。) w4 c  h" c$ I1 U
    比较常用的是SPI,在Arduino中,有一个叫SPI.cpp的源文件负责SPI通信,先从SPI来编写C语言实现。首先想到的文件名字是SPI.c。这样工程中就有这么两个文件SPI.cpp和SPI.c,但是编译的时候出现了错误,看控制台的输出错误内容大部分都是找不到SPI.c文件中的函数(全部使用extern "C"),明明已经添加进去了,为什么没有参加链接呢?, y0 X0 w) b7 @. K
    好好地看控制台的输出,发现有一个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,虽然更名了,但是并没有参与到最后的链接中。这也就是导致最后找不到函数实现错误的根源。
# z" ]& k9 W2 M9 ~+ f, j& i, j    其实,当初在进行移植Arduino的时候,发现Arduino为生成的.o文件命名的方式特别奇葩,举个例子来说,还是这个SPI.cpp,Arduino将它生成的.o文件命名为SPI.cpp.o,如果是SPI.c,那么就是SPI.c.o。一开始对这个奇葩的命名方式不是很理解,认为这个纯属蛋疼,现在终于明白了。
; o* x' Z8 ^6 D    希望使用mdk的人不要栽在这个地方。
& e! j6 N! Z7 S: I, c
& _0 P- m) r  E9 Q/ Y2 i% r

* P$ ~" Q0 g  S* w  a& r$ Q    ARM公司的处理效率真高,今天中午大约十点的时候将这个问题提交到了KEIL官网,就在刚才北京的售后打来电话询问情况(可能是我在KEIL官网用英文提交的内容太菜了,他们看不懂吧)。真不好意思说我用的是破解的。。。
2 z+ k! t3 g4 P' V   
7 E% e7 E4 P0 O& _8 ^
赞 收藏 1 评论21 发布时间:2015-3-3 13:26

举报

21个回答
Mandelbrot_Set 回答时间:2015-3-3 16:19:02
试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
* P- H1 ?  {. x$ O  k- _# j----------------------------------------------------------------------------------------
  r: ]. x0 a0 D8 w" R, K8 b) GF (.\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")7 C* P7 N: c  g; l0 W
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")
  B; v2 r+ t( e, A5 n感觉MDK这个依赖关系生成的就不科学...
qianfan 回答时间:2015-3-3 18:06:55
安 发表于 2015-3-3 16:36/ _2 r4 v( {3 Q. R, t( N
谢谢楼主分享,平时只使用.C,没有发生过类似的问题,这个可以作为借鉴,帮助他人解决问题。 ...

( [1 H- m* j0 V; [8 I像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回到C语言。
/ B( J& ^, s9 e期待什么时候OS,GUI能够出一份C++的库来使用。
qianfan 回答时间:2015-3-3 18:05:06
Mandelbrot_Set 发表于 2015-3-3 16:19
! S+ P1 |( I) a" a0 M, v0 J试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
$ C5 V" F7 i3 h& @; A3 ~$ b--------------------- ...

, o  y, ?, H- ~/ Z7 z, D. l' ^2 `6 q两个生成的名字都是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:534 I6 _- ], P# M6 `6 [9 F: j  h' A
感谢楼主

( h8 A% D* J: k: V感谢沐紫姐参与
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% [' q; p& a3 |  X8 J# S1 k
两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的dela ...
4 o0 H  t+ P" M5 {+ R1 e/ d" M/ Y* x
好像跟添加顺序有关,好像跟.dep列出的先后顺序有关.
废鱼 回答时间:2015-3-4 09:16:29
QianFan 发表于 2015-3-3 18:06
5 }" p4 h9 R& f4 ^6 U+ z1 w1 m像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...

4 R' l/ p6 o/ y# [+ [会的,慢慢都会改变的。
feel-376797 回答时间:2015-3-4 09:23:51
谢谢分享
Mandelbrot_Set 回答时间:2015-3-4 09:36:18
QianFan 发表于 2015-3-3 18:06
& ?+ j$ n" X1 r! ]像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...
9 H+ W( B1 |/ S+ T, ?0 Q- r
github上还是可以找到一可供参考的东西的.
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版