MDK生成lib时必须注意的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/OHRadiance/article/details/80972941

坑在何处

mdk版本4.54(版本虽老,历久弥香)
C语言的编译过程,是先预编译,再转成汇编,再编译成.o文件,再链接。
此处的坑就是在链接时,汇编要调用C函数,但是C函数被编译器优化了。
优化之后,程序运行时连异常都不会进入,直接飞掉。

问题分析过程

过程其实很简单,就是通过debug功能检查程序的走向。
(这里要说下,怎么debug lib呢,就是保持你生成lib所用的工程路径不变。
mdk会自动把lib映射到源文件。)
在等待中断的时候,发现程序飞掉了,很明显中断没有进入。
但是,写在另外一个文件中的中断函数却可以正常进入。
然后,在调用lib的工程中,定义了一个同名函数(与无法进入的那个中断函数同名)。
竟然没有报multi define。
很明显,那函数所在的源文件根本没有被链入。
然后又试了下,在此源文件中任意定义一个函数,再生成lib。
再在调用lib的工程中,调用此函数,就一切正常了,此时明显,该源文件被链入了。
所以,问题的关键是:lib文件中未被C代码调用的源文件,在lib被调用时的链入问题。

现象总结

过程省略1万字,直接归纳下现象。
1,不使用lib的话,所有源文件放在一起,汇编调用C函数没有任何问题。
2,生成lib后,此时lib中的某个源文件仅被lib中的汇编调用,则此文件不会被链入;
3,但只要在任意地方(lib中或者调用lib的工程中),调用了此文件中的任一个函数,即可链入该文件。

解决方案

怎么解决就是在那个源文件中写一个空函数,然后找个地方调用下就好了。

小结

调用lib时mdk的优化明显和源文件放一起时不一样。
通过一些所谓的防优化手段无法适用于此种调用lib的情况。

其实,现象可以归纳为:lib包含了源文件,但是调用lib的工程和lib中的C代码没用到它,它就不会被链入。
具体原因不去纠结了,这个设定本就很诡异。至于怎么去配置工程来解决此问题,不如保证lib中的每个汇编调用的C源文件都有被lib中的其它C代码调用,毕竟工程中不会有太多汇编。

猜你喜欢

转载自blog.csdn.net/OHRadiance/article/details/80972941