本帖最后由 QianFan 于 2015-3-3 14:42 编辑 ' V- c, b# ~! ?4 V, a 9 r. R* F# X6 O* k: q 今天使用keil mdk编译工程,工程中有多个源文件,还是采用Arduino的软件结构。 后来发现像一些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"),明明已经添加进去了,为什么没有参加链接呢? 好好地看控制台的输出,发现有一个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。一开始对这个奇葩的命名方式不是很理解,认为这个纯属蛋疼,现在终于明白了。 希望使用mdk的人不要栽在这个地方。 & r& k9 e. X0 v- l; g1 X+ v* p / y6 |2 O" w, S" F; F ARM公司的处理效率真高,今天中午大约十点的时候将这个问题提交到了KEIL官网,就在刚才北京的售后打来电话询问情况(可能是我在KEIL官网用英文提交的内容太菜了,他们看不懂吧)。真不好意思说我用的是破解的。。。* {* C* Q @0 O4 ? |
----------------------------------------------------------------------------------------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")
感觉MDK这个依赖关系生成的就不科学...
像现在的OS,GUI的库基本都是使用C语言写得,使用C++编写的自己的函数,无法兼容这些,所以最后还是要回到C语言。. x7 g5 s5 Q; R- N6 j
期待什么时候OS,GUI能够出一份C++的库来使用。
两个生成的名字都是delay.o,你的KEIL最后链接的时候是使用了C语言版本的delay.o还是使用的C++版本的delay.o?
感谢沐紫姐参与
好像跟添加顺序有关,好像跟.dep列出的先后顺序有关.
会的,慢慢都会改变的。
github上还是可以找到一可供参考的东西的.