在 Visual Studio 中使用 mdk 编译 ARM 程序

2019-08-13 18:28发布

 

Visual Studio 中使用 mdk 编译 ARM 程序

作为一个集成开发环境,Visual Studio 的强大是无可否认的。其中一个让我欣赏的地方就是它的代码编辑器,特别是和 Visual Assist X 软件配合起来使用的时候,可以很好的减轻程序员写代码的负担。当然直接使用 Visual Studio 作为代码编辑器来写 ARM 程序是可以的,但是如果你不进行配置,每次要编译的时候都得重新打开 keil,很麻烦。为了解决这个问题,下面我将介绍如何在 Visual Studio 的环境下使用 mdk 编译 ARM 程序。 (这里讲的配置方法是不用写任何代码的哦亲!)

1. 原理参考

要脱离一个 IDE 来编译程序,其中一个方法就是使用命令行,一行一行的敲命令,一个文件一个文件地编译。不过每次敲命令行这种方式的效率是极低的!绝对会让你抓狂的!那么就可以用一个批处理文件来做命令行的工作,但是悲剧的是我不知道怎么调用 mdk 的编译器和链接器来生成目标文件,我甚至连 bat 文件怎么写都不会。于是,不知道的时候要看看 mdk help 文档,搜索关键字 “BAT”,不用费多少工夫就能找到说明了:

fficeffice" /> 看它的意思是 MDK 能自动生成 .BAT 文件哦!貌似不用敲代码貌似很有人哦!

2. MDK配置步骤

1) 打开项目配置对话框,Output 选项卡,勾选 Creat Batch File 选项

2)
回到 mdk 界面,重新编译一次工程,注意到第一行的提示。

3)
打开项目所在的文件夹,发现多了个 APP.BAT 文件。

4)
用文本编辑器打开这个文件看看,可以看出里面使用了很多 Mdk 生成的 .__i 文件。这些大可不必管它,只要不要删除 APP.BAT 里面提到的那些文件就行了。我后来发现 APP.BAT 有一个小错误,需要修改。在文件的最后一行,补上引号(如果你的MDK安装目录中有空格或中文字符就需要这样做)

5)
到这里 mdk 相关的配置已经结束了。如果你双击这个 .bat 文件,它就可以重新生成目标文件,但是命令行一闪即逝,出错了也看不到。用起来并不方便。 注意:每次修改了 mdk 的项目配置或修改增加了源文件都需要在 Keil 中重新编译(步骤2)一次!

3. Visual Studio 配置

我假定你已经使用过 Visual Sdudio 了,所以在下面我不会介绍怎么使用 Visual Sdudio创建项目并添加源文件到项目中。下面将介绍怎么配置 Visual Studio ,从而在主界面添加一个的按钮,用这个按钮来使用 mdk 生成你的项目。 1) 打开 visual studio,工具->外部命令

2)
弹出对话框后,点击“添加”按下图创建一个新的命令,注意到命令的内容就是刚才那个 .BAT 文件,注意命令使用的路径是相对路径,这个需要根据你的具体项目的文件结构填写。其中的 $(SolutionDir) 指的是 Visual Studio 项目文件的位置(严格的说是解决方案文件的位置。

3)
创建自定义工具栏。工具->自定义


弹出一个对话框后,点击新建, 名称就定为 mcu tools 吧。然后点确定,关闭上面的自定义对话框。

回到 Visual Studio 主界面,可以找找刚才新建的对话框,里面啥也没有呢。

4)
对新的工具栏添加按钮。
弹出对话框后按下图操作:

注意这里的 8 需要根据实际情况选择。

5)
到这里,就配置完成啦,简单吧,点击这个  试试看吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
47条回答
zenghi
1楼-- · 2019-08-15 06:21
 精彩回答 2  元偷偷看……
jj123paopao
2楼-- · 2019-08-15 06:59
好帖,我还不知道vc有这个功能,以前只是用它创建个C   source file,然后敲点代码,编译,验证语句的使用而已,功能还真强大,学习了!
熊瑟
3楼-- · 2019-08-15 07:51
留名,VS比MDK好用太多...
gujie
4楼-- · 2019-08-15 11:41
楼主牛逼啊
Pony279
5楼-- · 2019-08-15 15:38

写了一个简陋的程序,用来自动修改 mdk 生成的 APP.BAT 文件的错误:
首先用这份代码创建一个 Windows 控制台应用程序,把可以把它生成的可执行文件改名为 error_check.exe ,复制到和 APP.BAT 的同一目录下,

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <list>
char default_name[]="APP.BAT";

using namespace std;

int main(int argc,char *argv[])
{
 char* name;
 if(argc>1){
  name=argv[1];
  cout<<"文件名参数:"<<name<<endl;
 }
 else
  name=default_name;
 ifstream fi(name, ios::_Nocreate); // 不创建打开
 if(!fi.is_open()){
  cout<<"文件读打开失败"<<endl;
  return 1;
 }

 // 读取文件到内存中
 typedef list<string> LineList;
 LineList list;
 for(string line; getline(fi,line);){
  //line.search
  list.push_back(line); // 加入链表
 }
 
 bool shouldModify = false;
 string subStr("fromelf.exe");
 // 因为该 BAT 文件是 Keil 自动生成的,
 // 错误只在最后一行,所以这里可以
 // 只检查最后一个字符串的语法
 string& s = list.back();
 auto pos = s.find(subStr);
 if(pos!=-1){
  if((s.at(0)!='"')&&(s.at(pos+subStr.length())!='"')){
   cout<<"find a syntax error :"<<endl
    <<" "<<s<<endl
    <<" "<<"missing ""<<endl;
   shouldModify = true;
    const char *quote = """;
   s.insert(pos+subStr.length(), quote);
   s.insert(0,quote);
   cout<<"auto modify :"<<endl
    <<" "<<s<<endl;
  }
 }
 fi.close();
 if(shouldModify){ // 如果需要修改文件,就把 list 的内容重新写入文件
  ofstream fo(name, ios::_Nocreate); // 不创建打开
  if(!fo.is_open()){
   cout<<"文件写打开失败"<<endl;
   return 1;
  }
  for(auto i=list.begin(); i!=list.end(); i++){
   fo<<*i<<endl;
  }
  fo.close();
 }
}

然后在 APP.BAT 的那个目录下,新建一个 arm_build.BAT 文件,文件内容为
error_check.exe
APP.BAT
其实很简单,就是调用 error_check.exe 去检查和修改 APP.BAT 的错误,然后再打开 APP.BAT 调用编译器。

然后再修改 visual studio 的外部工具里的设置就行了,不直接用 mdk 生成的 APP.BAT 了,改成自己写的 arm_build.bat



这样就不用每次用 keil 重新 build 以后又手动改错误了

用 KEIL 生成的 BAT  文件效率比较低,每次都要全部重新编译,我有点觉得他们是故意这样做的 = =
Pony279
6楼-- · 2019-08-15 15:57
 精彩回答 2  元偷偷看……

一周热门 更多>