scons --dist命令使用后的错误

今天学习使用scons命令从rtthrea源代码,生成一个纯净的rtthread工程。

  1. 下载 rt-thread-master包
  2. 由于手上有一套野火的开发板,就选了bsp/stm32f10x-HAL这个工程
  3. 在工程目录中,进入env,使用命令“scons --target=mdk5”,对工程进行更新
  4. 然后打开更新过后的keil工程,工程编译正常,可以生成bin文件
  5. 关闭该工程,再次进入env,使用命令“scons --dist”,顺利生成一个dist目录的新的工程出来,拷贝dist工程到合适的位置,同样进入工程目录后,使用env工具,用命令“scons --target=mdk5”,对工程进行更新。也可以顺利进行。
  6. 生成新的keil工程后,打开工程进行编译,会报错。


    scons --dist命令使用后的错误_第1张图片
    报错截图

根据错误提示,Error: L6218E: Undefined symbol rt_hw_interrupt_disable (referred from drv_gpio.o).
是rt_hw_interrupt_disable这几个函数未定义,我在原工程搜索了一下,发现这几个函数在libcpu中,想着会不会是生成新工程,没有将libcpu拷贝,所以就将这个文件夹全部拷贝到dist的根目录,重新编译,又报另外几个函数 重复定义 的错误。

scons --dist命令使用后的错误_第2张图片
重新编译后的错误

  1. 根据错误提示,by cortex-m3_cpuport.o and cpuport.o,说明之前新建的工程中,已经有cpuport.c文件了,重新查看搜索了一下工程,发现新建的工程文件中,dist\stm32f10x-HAL\rt-thread\libcpu\arm\cortex-m3这个目录下已经存在了libcpu,当然cpuport.c文件也在里面了,对比了一下这个目录和源工程目录rt-thread-master\libcpu\arm\cortex-m3,发现里面只有cpuport.c和context_gcc.S(gcc编译器用的)两个文件,比源文件烧录iar和keil的处理中断的汇编代码。

  2. 不用说,继续将keil对应的context_rvds.S文件,放入dist对应的libcpu目录下,重新进入env,命令“scons --target=mdk5”更新工程,确实发现了这个汇编文件。如下图:

scons --dist命令使用后的错误_第3张图片
增加文件
  1. 既然找到了文件,就再次打开生成的keil工程,重新编译吧,果不其然,顺利通过编译,至此这条“scons --dist”命令,才算真正从rtthread源代码实现了私有工程的创建!!


    scons --dist命令使用后的错误_第4张图片
    image.png
  2. 来条总结:
    实践说明,在使用“scons --dist”命令时,。env默认是将工程按照gcc编译器的情况进行生成的,并没有按照mdk5。百度了一下,发现网上已经有前辈们淌过坑,只是自己没注意,也淌了坑!!!具体方法如下图所示,在env工具中执行下图的命令(1)。


    scons --dist命令使用后的错误_第5张图片
    image.png

    scons --dist命令使用后的错误_第6张图片
    在工程目录的rtconfig.py文件中也可以验证,默认是gcc编译器

需要注意的是,不是SETRTT_CC=XXX,是SET RTT_CC=XXX,SET命令后面有空格,RTT_CC是一个变量,表示RTT的编译器名称。

你可能感兴趣的:(scons --dist命令使用后的错误)