将mdk工程转为cmake工程探索(三)

本来想终结这一系列,不过最近使用keil开发后又有些心得,因此打算利用空闲时间再将它继续下去

上篇回顾:

  • 四号错误由于内容太多,就不再贴一遍了,参考将mkd工程转为cmake工程探索(二)

注意到,错误信息里包含了很多这样的信息:

/home/b/workspace/stm32/share/usart.c:91:3: error: unknown type name 'GPIO_InitTypeDef'    
GPIO_InitTypeDef GPIO_InitStructure; 
  • 很明显,GPIO InitTypeDef 是有定义的,就在stm32f10x_gpio.c里,这时候,想起了keil开发时要设置的define。于是,在led/CMakeLists.txt里加上一行
    add_definitions(-DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD)

  • 然后 cd build&&cmake ..&make
    wow,进度条一路到了100%,这是要成功了吗?不又冒出个错误

错误五

arm-none-eabi-gcc: error: unrecognized command line option '-rdynamic'

src/CMakeFiles/led.hex.dir/build.make:105: recipe for target ‘src/led.hex’ failed
make[2]: * [src/led.hex] Error 1
CMakeFiles/Makefile2:500: recipe for target ‘src/CMakeFiles/led.hex.dir/all’ failed
make[1]: * [src/CMakeFiles/led.hex.dir/all] Error 2
Makefile:83: recipe for target ‘all’ failed
make: * [all] Error 2

  • 既然是卡在最后一步,那我们想想编译器最后一步要做什么。target-link!!!即连接生成最后的hex二进制文件。那还有什么没写到CMakeLists.txt里?没错,是启动文件。

  • 打开keil看一看,在keil里只要把启动文件添加到工程,什么也不用设置,编译的时候自动会链接,把启动文件从工程中删除,编译同样卡在最后一步,所以这想法很靠谱。

  • 再打开启动文件看看,发现启动文件是用汇编写的。如何在cmake中设置编译汇编文件呢?多番搜索无果。那就自己实验。


  • 汇编文件的编译是由binutils这个组件来进行的,dpkg -l|grep binutils,发现在装arm-none-eabi*的时候已经自动把它装了。那直接给启动文件指定特定编译器看是否可行。然后发现,无论在哪个/bin目录下都找不到arm-none-eabi-binutils。想起gcc直接就能编译汇编文件,所以想到这个组件应该是由arm-none-eabi-gcc调用的,不能直接显式调用。而在开头已经指定了arm-none-eabi-gcc编译器,所以此路不通。

  • 然后,在cmake的官方DOC中发现了这一句enable_language(ASM),重新写了一个小工程实验,可行!!于是修改CMakeLists.txt如下:

    ./led/share/CMakeLists.txt


    加上
    enable_language(ASM)
    add_library(startup startup_stm32f10x_hd.s)

    ./led/src/CMakeLists.txt


    最后一句改为

    target_link_libraries(led.hex startup sys delay led usart core misc stm32f10x_gpio stm32f10x_rcc stm32f10x_usart stm32f10x_it system_stm32f10x

  • cd build&&cmake ..&&make

错误六

/home/b/workspace/stm/template/share/startup_stm32f10x_hd.s: Assembler messages:
/home/b/workspace/stm/template/share/startup_stm32f10x_hd.s:1: Error: bad instruction `stack_size EQU 0x00000400'
/home/b/workspace/stm/template/share/startup_stm32f10x_hd.s:3: Error: bad instruction `area STACK,NOINIT,READWRITE,ALIGN=3'
/home/b/workspace/stm/template/share/startup_stm32f10x_hd.s:5: Error: bad instruction `__initial_sp '
  • 这样的错误很多,几乎每一行都有,怀疑是不是CMakeLists.txt设置编译器的问题,直接使用arm-none-eabi-gcc编译,发现错误一样,所以排除这个可能。这问题暂留下一篇博客解决

你可能感兴趣的:(将mdk工程转为cmake工程探索(三))