本文转载自微信公众号《鱼鹰说MCU》,作者鱼鹰Osprey。转载本文请联系Osprey谈MCU公众号。题目中的一些项目可能包含很多文件(比如rt-thread项目),你可能不需要,但是它们都保存在你的项目目录下,如果你想删又怕删错了,可以太多了,就不一一梳理了。麻烦。更有什者,当你使用SI(sourceinsight)查看源代码时,因为你不知道你当前的文件需要哪些文件,所以你只能一次性将所有的源文件添加到项目中。然后你会发现一个main函数有多个定义,不知道哪个文件的main函数是main函数(看linux源码也是一样,不知道编译成哪些文件内核)。此外,SI同步时间也大大延长。几秒内完成同步,可能需要十几秒、几十秒。有什么好的方法可以提取MDK工程中包含的文件吗?当然有。最近,Osprey专门为此编写了一个脚本。通过在gitbash中执行这个脚本,就可以完成提取工作(包括汇编文件、C文件和包含的头文件)。对于汇编文件和C文件,我们可以通过打开*.uvopt文件找到对应的文件路径。但是头文件呢?我们知道MDK工程是可以编译通过的,那么MDK肯定知道去哪里找头文件,所以我们需要想办法找到这些信息。然后我们就可以在Objects文件夹下的*.d文件中找到对应的头文件路径(每个源文件都有一个对应的*.d文件,比如上面main.c对应的文件就是main.d)。用记事本打开main.d文件:我们可以看到main.d文件的第一项是C文件,后面是头文件的路径。因为这个文件目前只包含一个头文件S3C2440.h,这个main.d文件中只有一个头文件信息。那么我们的脚本要做的事情就很简单了,就是收集所有源文件的*.d文件信息,然后进行相应的处理。脚本如下:#!/bin/bash#Author:Osprey#此脚本用于生成MDK包含的源文件信息#用MDK编译后,在工程文件目录dir_obj=./obj中执行此脚本#*.dfileThedirectorywhereout_file_name=absolute_files.txt#输出文件名(绝对路径)relative_out_file_name=relative_files.txt#输出文件名(相对路径)###当前路径处理#斜杠换成反斜杠\也是特殊字符,需要转义``curr_dir=`pwd`/echo${curr_dir}|sed's/\//\\/g'>${out_file_name}&&curr_dir=`cat${out_file_name}有问题`curr_dir=${curr_dir#*\\}#去掉第一个斜杠#第一个反斜杠替换为:\echo${curr_dir}|sed's/\\/:\\/'>${out_file_name}&&curr_dir=`cat${out_file_name}`#Replace\To\\preventsedcommanderrorecho${curr_dir}|sed's/\\/\\\\/g'>${out_file_name}&&curr_dir=`cat${out_file_name}`echo"currdir:${curr_dir}"#*.d文件包含源文件信息,所以没有需要从*.uvoptx中提取它。以下if命令如果为false则无意义;然后dir_uvoptx=./file_uvoptx=`find${dir_uvoptx}-name"*.uvoptx"`echo"filethename:${file_uvoptx}"sed-i"s//"${curr_dir}"/g"${out_file_name}sed-i's/<\/PathWithFileName>//g'${out_file_name}fi#先进入目录cd${dir_obj}temp_file_name=temp_files.txtfind./-name"*.d"|xargscat>head_temp.txt#合并所有d个文件sort-uhead_temp.txt>head_temp1.txt#去除标准头文件搜索关键字':\'(包括标准头文件),分隔符':'去除*.O文件名'o:..''o:\。\.'cathead_temp1.txt|grep-v':\\'|awk-F":"'{print$2}'>head_temp.txt#replace/for\sed-i's/\//\\/g'head_temp.txt#添加绝对路径absolute_files=../${out_file_name}echo"addabsolutedir:${curr_dir}"#双反斜杠是为了防止sed命令出错#在行首(^代表行首)添加绝对路径字符串sed"s/^/"${curr_dir}"/g"head_temp.txt>${absolute_files}#添加相对路径(去掉..\)必须用单引号(判断是否去掉..\根据SI工程情况)relative_files=../${relative_out_file_name}sed's:\.\.\\::g'head_temp.txt>${relative_files}rmhead_temp.txthead_temp1.txt#deletefilecnt=`wc${absolute_files}|awk'{print$2}'`#Countthenumberoffilesecho"allfilesissasavedinfile:${absolute_files##*/}&&${relative_files##*/},filesnumberis:${cnt}"这个脚本会在当前目录生成两个文件,absolute_files。txt和relative_files.txt,其中包含两个路径路径信息,如果使用相对路径,可以使用relative_files.txt导入到SI工程中,例如通过下面的“addfromlist”导入这个文件relative_files.txt:那么这个脚本怎么用呢?特别注意,不要中文,否则会执行失败(下面截图中的路径是中文的,所以会失败)0.编译MDK并生成*.d文件1.将脚本保存到一个文件中,比如mdk_list.sh2。将脚本复制到项目目录下修改脚本的*.d文件夹路径,这里的路径是obj,3.打开gitbash4,执行刚才的脚本(这里的后缀可以随意,无所谓),并且在脚本目录./mdk_lsit下可以生成两个文件。sh.txt生成的头文件路径中没有标准的头文件(可以自己修改脚本支持),因为这个一般在MDK的安装目录下,所以去掉这个信息。5、可以打开文件查看信息:绝对路径:相对路径:特别注意:使用SI导入本文件时,SI工程路径必须与MDK工程一致。即下面两个文件(文件夹)必须在同一个目录下才能顺利添加。如果MDK工程文件在子文件夹下,那么SI工程也必须在子文件夹下,否则SI导入会失败。毕竟使用相对路径的时候,如果找不到对应的文件就会失败,而使用绝对路径的时候就没有这个要求了,但是会影响SI工程的使用(工程不能移动或者重命名)随意),脚本函数可以自行修改,以适应不同的情况。总之,基本的脚本功能和思路已经提供给大家了。如何根据实际情况修改,是道友们的疑问。搜索、重命名、计数、比较数字等。最后友情提示,删除源文件的时候,需要有备份或者git管理,不然删错了会后悔的。