这里我们选择了c++17。其他设置与在Windows上进行开发时一样,vs可以自动转换成g++的参数,这里就不再赘述。
添加远程环境有了远程环境我们才能同步头文件或者进行调试运行。
在第一次编译或调试你的项目时vs会自动让你连接远程环境,当然,我们推荐在调试->选项->跨平台->连接管理器中进行设置:
填入你的远程ip/域名,端口ssh默认为22,安全起见你需要修改成其他端口,这里方便演示使用了默认配置,密码同上,你应该考虑使用更安全的ssh私钥登录。
登录成功后这个连接就添加完成了,我们看到管理器下面还有一个远程标头管理器的设置项,这就是用来同步头文件的:
点击更新按钮就会开始同步头文件,这些文件会被缓存在本地,因为要从远程一次性复制大量文件,所以可能会花费较长的时间。
这样远程环境就添加好了,可以开始写代码了。
本地编写和远程调试至此你已经可以在vs中编写面向Linux平台的代码了,自动补全可以正常工作:
可以看到Linux中的头文件和结构体都已经可以识别了。如果你发现无法自动补全(通常发生在刚添加远程连接或是项目设置发生了变化后),先试试关闭vs重新打开,如果没用请尝试刷新intellisense或重新同步头文件。
在编辑结束后我们就能点击调试按钮运行我们的程序了:
注意,构建的体系架构必须是和远程环境一致的,比如远程环境是x64,这里可以选择x64或x86,但是不能选择arm,否则会报错。
这是测试代码,它将输出当前Linux系统内核的版本:
#include <sys/utsname.h> #include <iostream> #include <cstdio> int main() { auto start = chrono::high_resolution_clock::now(); utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; }点击调试->Linux 控制台,会显示一个可以交互的console,你可以在其中输入内容或是看到程序的输出:
程序运行成功。
避免踩坑远程编译顺利完成后,我们就可以接着利用vs debugger设置断点,在断点处查看变量,甚至对运行中的Linux进行动态性能分析了。
不过在此之前,还有一些坑需要提前踩掉。
中文乱码编码问题带来的麻烦永远会被放在第一位,毕竟当人们看到预想的输出实际上是一堆乱码时总会不可避免得紧张起来。
众所周知,编码问题一直是老大难,特别是Windows上中文环境通常是GB18030或GBK,而Linux上统一为utf8时。
下面看个实际例子,通常我们的程序里只包含ASCII字符的话不容易产生问题,所以我们加上一点中文字符:
#include <sys/utsname.h> #include <iostream> #include <cstdio> #include <string> int main() { utsname names; if (uname(&names) != 0) { std::perror("cannot get unames"); } std::cout << "Linux kernel version: " << names.release << std::endl; std::cout << "输入内容:"; std::string input; std::cin >> input; std::cout << "你输入了:" << input << std::endl; }对于上面的测试程序,我们添加了一点中文输出信息,现在打开控制台进行调试: