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

KEIL MDK吐槽

[复制链接]
qianfan 发布时间:2015-3-3 13:26
本帖最后由 QianFan 于 2015-3-3 14:42 编辑 ' V- c, b# ~! ?4 V, a
9 r. R* F# X6 O* k: q
    今天使用keil mdk编译工程,工程中有多个源文件,还是采用Arduino的软件结构。
; y9 v+ F0 |$ y- R+ v$ x! s    后来发现像一些GUI的库都是使用C进行编写的,在*.c文件中是不能来调用C++的函数的,只好对部分函数重新编写C的实现。* N( x; c7 q( |% B2 ^
    比较常用的是SPI,在Arduino中,有一个叫SPI.cpp的源文件负责SPI通信,先从SPI来编写C语言实现。首先想到的文件名字是SPI.c。这样工程中就有这么两个文件SPI.cpp和SPI.c,但是编译的时候出现了错误,看控制台的输出错误内容大部分都是找不到SPI.c文件中的函数(全部使用extern "C"),明明已经添加进去了,为什么没有参加链接呢?
' z/ d, N' U: J: M    好好地看控制台的输出,发现有一个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,虽然更名了,但是并没有参与到最后的链接中。这也就是导致最后找不到函数实现错误的根源。* G2 P7 ]5 a% o$ t& \
    其实,当初在进行移植Arduino的时候,发现Arduino为生成的.o文件命名的方式特别奇葩,举个例子来说,还是这个SPI.cpp,Arduino将它生成的.o文件命名为SPI.cpp.o,如果是SPI.c,那么就是SPI.c.o。一开始对这个奇葩的命名方式不是很理解,认为这个纯属蛋疼,现在终于明白了。
1 m9 ^3 V5 G; `8 b    希望使用mdk的人不要栽在这个地方。
  Z2 g/ B( L. o; S+ x& r& k9 e. X0 v- l; g1 X+ v* p
/ y6 |2 O" w, S" F; F
    ARM公司的处理效率真高,今天中午大约十点的时候将这个问题提交到了KEIL官网,就在刚才北京的售后打来电话询问情况(可能是我在KEIL官网用英文提交的内容太菜了,他们看不懂吧)。真不好意思说我用的是破解的。。。* {* C* Q  @0 O4 ?
   
/ l1 o+ ^7 y" L! s# ^
收藏 1 评论21 发布时间:2015-3-3 13:26

举报

21个回答
Mandelbrot_Set 回答时间:2015-3-3 16:19:02
试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)6 T+ l' z/ J4 ]; G. O6 v8 a: Z
----------------------------------------------------------------------------------------7 F2 c: R+ P/ b$ f' Z; E3 y; 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")& i6 n$ w* Y2 v: Q, Y
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")
( [& Q6 Y4 q# A7 D* h" B! Y感觉MDK这个依赖关系生成的就不科学...
qianfan 回答时间:2015-3-3 18:06:55
安 发表于 2015-3-3 16:36
: w- O" N4 K% V: ^6 k7 f谢谢楼主分享,平时只使用.C,没有发生过类似的问题,这个可以作为借鉴,帮助他人解决问题。 ...

9 B5 s; C7 \4 J$ D1 x像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回到C语言。. x7 g5 s5 Q; R- N6 j
期待什么时候OS,GUI能够出一份C++的库来使用。
qianfan 回答时间:2015-3-3 18:05:06
Mandelbrot_Set 发表于 2015-3-3 16:19
, ]8 p- Y6 E/ o2 l9 q试了一下,楼主果然仔细,确实如楼主所言,只是我这没有生成_1.o(可能我版本太低了...)
, s- O9 }, S- T. n% o9 I) P; @--------------------- ...

- [2 F+ E9 p, }# m* C2 r# A, h5 O0 j两个生成的名字都是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
0 o, |6 W; |$ Y" T' o+ C感谢楼主

, v/ {/ Q: Y3 m' A" _6 o感谢沐紫姐参与
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
# N$ Z3 X4 _& _. ?: Y两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的dela ...

) H5 K1 b3 s0 U2 I+ x2 D: T) X2 g好像跟添加顺序有关,好像跟.dep列出的先后顺序有关.
废鱼 回答时间:2015-3-4 09:16:29
QianFan 发表于 2015-3-3 18:06' V+ V. q( J- @! k+ Q, O) x
像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...
% }1 U, W' d6 w2 e* S, }- Y# G
会的,慢慢都会改变的。
feel-376797 回答时间:2015-3-4 09:23:51
谢谢分享
Mandelbrot_Set 回答时间:2015-3-4 09:36:18
QianFan 发表于 2015-3-3 18:06
: Z  @: z* R# N8 I* h' M像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回 ...

" K/ `0 z8 E5 c; S( igithub上还是可以找到一可供参考的东西的.
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版