1、环境准备
1.1、软件安装
在Windows10/Windows11系统上安装Visual Studio 2022和装有Linux系统的虚拟机VMware Workstation Pro。(这里以Visual Studio 2022为例,也可以换成其它支持远程调试的工具版本如Visual Studio 2019及更高的版本)
注意:安装Visual Studio 2022时一定要勾选上“使用C++的Linux和嵌入式开发”的工具集。
虚拟机安装完成后,进行Linux系统的安装。
注意:明确系统的cpu架构,是x86、x64、ARM还是ARM64,这在之后的Visual Studio中需要选择编译平台。
1.2、Linux系统环境配置
- 配置Linux系统的SSH连接
以ubuntu16.04为例,需要在Linux系统上安装可进行C++程序编译以及远程调试的包。使用如下命令:
sudo apt-get install openssh-server g++ gdb gdbserver -y
- Linux系统交叉编译链的设置
以rk3399交叉编译链为例进行说明。需要注意的是rk3588使用的也是这个交叉编译链工具。交叉编译链工具存放目录为RK3399/linuxsdk-friendlyelec/buildroot/output/rockchip_rk3399/host/bin/ 其中部分工具的截图如下:
2、Visual Studio 2022交叉编译ARM工程项目
2.1、设置远程连接
- 在 Visual Studio 中,依次选择菜单栏上的“工具”>“选项”,以打开“选项”对话框。 然后,依次选择“跨平台”>“连接管理器”,以打开“连接管理器”对话框。如果你以前没有在 Visual Studio 中设置过连接,Visual Studio 会在你首次生成项目时,为你打开“连接管理器”对话框。
- 设置完成以后就可以开始写代码测试了。执行程序的地方,默认会出现上面配置的远程Linux系统的IP地址。
- 如果需要使用Linux控制台与应用进行交互,请选择“调试”->“Linux控制台”。
- 上图中点击“开发者PowerShell”下拉菜单,出现如下图所示的选项。
- 选择需要进行远程连接的系统,以本地虚拟机中的ubuntu系统yy@192.168.117.128为例,连接成功会出现如下所示:
- 在Linux控制台里可以像在Linux系统里的终端一样进行操作,例如进行文件的查看和代码编译等。
2.2、在Visual Studio中进行ARM工程的配置和交叉编译
创建一个C++的Linux控制台应用程序项目存储在本地。根据远程Linux系统的CPU架构,选择对应的配置。由于要使用交叉编译链进行ARM应用程序的生成。选择配置为ARM或ARM64。以ARM64为例进行说明。
按照ARM工程的目录结构,新建筛选器如下图。
在各筛选器下依次添加原ARM工程代码文件。这种方法对于其它需要在VS2022编译Linux程序的项目也适用。
配置项目属性,如下:
对于ARM64平台的所有配置,其常规设置可以一致。修改目标文件名,删除目标文件扩展名.out,与原ARM工程应用程序文件名保持一致。平台工具集选择GCC for Remote Linux,远程生成计算机由远程连接时填入的信息生成,远程根目录为”~/projects”。
调试属性中,要启动的调试器为远程GDB调试程序。调试模式有gdb和gdbserver。gdb调试是应用程序在开发板上运行,然后在PC机上对开发板上的应用程序进行调试,PC机运行gdb,开发板上运行gdbserver。在应用程序调试的时候,pc机上的gdb向开发板上的gdbserver发出命令,开发板上的gdbserver会向应用程序发出信号,使应用程序停下来或者完成一些其它工作。
远程调试器类型分为gdb和lldb。gdb是Unix和类Unix系统下的调试工具,lldb是个开源的具有REPL(read-eval-print-loop,读取-评估-打印-循环)特征的Debugger。
调试属性中的其它选项按照默认设置。
VC++目录属性设置可以略过。
复制源属性设置如下图。均是默认设置。需要注意的是远程复制源方法,VS2022中提供了rsync和sftp。这两种工具均可通过SSH传输文件。rsync是一个用于*unix系统的文件同步和文件传输程序,可通过使用一种增量编码形式来最小化网络数据传输,这样只有源数据和目标数据之间的差异才会被传输。sftp是用于在两台机器之间进行安全复制的基本命令行工具。sftp协议允许对远程文件进行一系列操作,包括恢复中断的传输、查看目录列表和删除远程文件等。
C/C++属性配置见下图C/C++所有选项,其中需要注意的是交叉编译链的设置(查了一下,目前网络上还没有这样简便的方法,算是独家配方了)。C编译器和C++编译器均设置为虚拟机ubuntu目录下的交叉编译链路径,以本机使用的交叉编译链工具为例,设置为 “home/yy/RK3399/linuxsdk-friendlyelec/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-g++”。
附加包含目录按照ARM工程中的源代码所处目录进行设置。
C/C++属性配置中其它选项按照默认设置进行。
链接器属性配置见下图链接器所有选项。需要注意的是附加库目录、库依赖项和链接器。附加库目录设置为远程系统中库文件所在的目录。
以本机使用的静态库libBase.a和libxxxx.a为例,因为xxxx以及程序中代码依赖pthread,在库依赖项中添加
pthread
Base
xxxxx
注意:在VS2022中添加静态库,不需要写lib或.a,只需要写静态库名称即可。
至此ARM工程的VS2022配置项完成。
接下来右键点击工程,选择生成,结果如下图所示,成功通过交叉编译链生成ARM应用程序。
同样,可以生成release版的ARM应用程序,如下图。
生成的应用程序不仅在本地存了一份,而且自动复制了一份到远程系统工程对应的目录里,如下图所示。
将执行程序通过远程工具拷贝至ARM开发板,赋予执行权限后,启动程序可以正常执行,使用远程工具拷贝后结果以及在终端执行命令后效果如下图所示。