快乐虾
http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)
欢迎转载,但请保留作者信息
本文仅适用于vs2013 + velt-0.1.3
1.1 什么是VELT
VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发。利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码。目前的版本是0.1.3,仅支持vs2013,是一个刚刚启动开发不久的插件。可以在CSDN下载频道下载(http://download.csdn.net/detail/lights_joy/8396189),安装过程参见《用VS2013+VELT-0.1.3进行Linux开发:环境搭建》。下面是它的基本功能:
- 支持x86 Linux,hi3516,hi3520,MinGW这几个平台。
- 完成UBOOT的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 完成LINUX内核的编译,并根据编译的错误信息自动定位到相应的文件位置。
- 完成Linux内核的配置。
- 不使用Makefile进行Linux应用程序的编译。
- 使用Makefile进行Linux应用程序的开发。
- 使用SSH连接目标机器并用gdb进行应用程序的调试。
- 使用Telnet连接目标机器并用gdb进行应用程序的调试。
本文将说明如何用VELT创建一个Hello World的Linux应用程序并进行调试。
1.2 工程创建
和普通WIN32程序一样,我们新建一个项目:
这里需要注意的是项目的存放位置,这个目录必须可以在windows下访问,也可以在Linux访问。如我的测试工程放在f:\projects\tmp,对应的Linux访问路径为:
/mnt/hgfs/projects/tmp
1.3 IntelliSense
在项目创建完成后,可以发现项目中只有一个main.c文件。但此时VS由于找不到包含文件的路径,也无法正确分析代码,显示出来就是这样的:
我们需要让vs的intellisense能够访问正确的头文件,将Linux系统下的/usr/include目录复制一份到windows,如F:\local_cache\linux\usr\include,这个目录只需要给VS访问,因此没有共享的要求,任何目录都可以!
接着我们需要告诉VS正确的头文件的位置,打开ConsoleApplication1的项目属性:
这里的三个选项都只会影响到vs的IntelliSense的分析结果,但这几个参数都不会传递给编译器!不会影响编译器的行为!
包含目录选项会影响到VS在查找头文件时的行为。
强制包含文件中可以处理gcc编译器和vc编译器之间的一些差异,如gcc中的__attribute__,VS并不支持,因此可以在强制包含的文件中将其定义为空:
#define __attribute__(x)
这样VS就可以正确分析代码了。
预处理器定义的作用和强制包含文件一样,也是方便VS分析代码。
在做了这个配置后,VS就不会有红色的错误提示了:
在stdio.h上右键选择打开文档,可以发现VS正确打开了我们复制过来的/usr/include目录下的stdio.h,而不是VC里的stdio.h。
再试一下vc所不支持的pthread
可以发现,IntelliSense完全可以正确地显示提示,YEAH~~~~
1.4 输出目录与中间目录配置
接下来配置输出目录和中间目录:
这里的参数含义和其它VC项目一致,也可以使用MSBUILD中的变量。
在此将输出目录和中间目录修改我们需要的路径,需要注意的是,这里的路径必须保证可以在Linux下访问!!
如我们项目使用了虚拟机的共享功能,它的Linux访问路径是/mnt/hgfs/projects/,在windows下的访问路径为:F:\projects\,而这个项目放在F:\projects\tmp\ConsoleApplication目录下,在Linux下的访问路径就是/mnt/hgfs/projects/src/ConsoleApplication,因此这个设置是没有问题的。
此处需要注意的第二个问题是大小写的问题,因为这个路径是需要在Linux下访问的,因此必须区分大小写。
1.5 更改编译主机配置
当生成工程时,VELT必须登录编译主机进行项目编译,因此接下来更改编译主机配置:
这里仍然需要注意的是Windows访问路径的大小写和路径结尾的斜杠。
如前所述,/mnt/hgfs/projects/是Linux下的共享路径,F:\projects\则是映射过来的windows路径,二者指向的必须是同一个位置!
在VELT登录到编译主机后,会将此处配置的可执行文件目录添加到PATH环境变量前面,因此这里的可执行文件目录必须是在编译主机上的Linux路径,此路径不会在windows下使用,也没有共享的要求。
1.6 更改目标机配置
在编译完成后,可以使用VELT进行调试,因此必须配置目标机的参数:
由于我们的目标机就是编译主机,因此这两个配置是相同的。
这里的目标连接类型支持ssh和telnet两种方式,本项目使用SSH。
在VELT登录到目标主机后,会将此处配置的可执行文件目录添加到PATH环境变量前面,因此这里的可执行文件目录必须是在目标主机上的Linux路径,此路径不会在windows下使用,也没有共享的要求。
在VELT登录到目标主机后,会将此处配置的库目录添加到LD_LIBRARY_PATH环境变量前面,因此这里的目录必须是在目标主机上的Linux路径,此路径同样不会在windows下使用,也没有共享的要求。
1.7 工程编译
在完成上述配置之后就可以按F7生成解决方案了:
在资源管理器下可以看到F:\projects\tmp\ConsoleApplication1\bin\Linux\Debug下生成了一个叫ConsoleApplication1的文件。
我们到Linux下运行它:
一切正常。
1.8 调试器配置
接下来试试调试功能,首先配置调试参数:
这里的命令参数不可更改,只能配置为$(RemoteConsole),这是和VC项目不同的地方!
命令参数可以配置为要传递给应用程序的参数。
当调试开始前,VELT将进入工作目录后启动gdb,因此这里的工作目录为目标机器上的目录,我们将其配置为项目的输出路径。
在登录目标主机后,VELT可以执行这里定义的调试前命令,在嵌入式系统开发中,可以在此将程序通过TFTP等协议下载到目标主机中,此项目中留空。
1.9 调试
试试在main这里设置一个断点,启动调试:
按F5,GO....
此时的console输出:
试试单步执行,一切正常!
1.10 不调试运行
再试试按Ctrl + F5,不调试运行,很不幸的是加载失败:
修改工作目录为F:\projects\tmp\ConsoleApplication1\bin\Linux\Debug:
搞定!
??