C++大神之路——环境篇

在我还在做后端的时候,当时程序员圈里就有个梗很火,说的是当时几种常用编程语言的鄙视链:做C++的鄙视做Java的,做Java的鄙视做C#的,而我很不幸,当时在鄙视链最底层。一开始只是当个笑话听听就算了,可是随着Java的不断兴盛以及C#的逐渐没落,心里还真的产生了一点自卑感。正是Java的开源和跨平台策略才让它异军突起,而微软前期的强大和过度自信让它一直保持着闭源的做法,而且始终不肯支持跨平台,用“闭关锁国”来形容都不为过。其实这也并不是问题的关键,毕竟IOS也是闭源的,也不见得它比安卓差,而最令开发人员接受不了的是微软的“朝令夕改”,好好的技术不好好发展下去,动不动就推翻重做,开发人员疲于奔命似的地跟在后面,学习成本极高,简直苦不堪言。再后来,被“玩坏了”的程序员逐渐脱离了.NET阵营,转投了Java、C++以及其他一些新兴语言。微软这时候也意识到了问题的严重性,逐渐实现了开源和跨平台,但似乎是醒悟的有点晚了,已经很难恢复到之前的辉煌了,至少说它的明星产品C#已经荣光不在了。

我也是脱离阵营的那一批,那段时间总想着把Java学起来,否则工作都难找了;C++也可以,但是太难了,一时半会学不会。纠结中阴差阳错地玩起了前端,并一直持续到了现在,本来以为此生与后端再无交集了,没想到又会再次相遇。有一个C++的开源项目,需要学习掌握并能够修改或新增功能。起初是兴奋不已,毕竟可以接触到"鄙视链"的顶端啦,也圆了多年前的梦了。可是当我拉下代码一看,整个人都是懵逼的状态,这不是天书吗,完全找不到下手的地方。硬着头皮扒拉了两天代码之后,我决定放弃这种做法了。霸王硬上弓可不是好的学习方法,基础,还是基础,必须打牢!故本系列文章由此诞生了。虽然题目有点夸大了,看完本系列文章并不一定能成为大神啦,只是我们心中得有梦想嘛,如果没有梦想,那么我们和咸鱼有啥区别?通往大神之路注定崎岖坎坷,且跟我一步一个脚印!

正文

做为本系列第一篇自然是要从环境搭建开始,没有戏台再好的戏都出不来。

操作系统

程序预期是要部署在 Linux 操作系统上运行的,按常理来讲我们也应该在 Linux 下布置开发环境,最好是带图形界面的 Linux OS,毕竟面向控制台开发还是很蛋疼的。带图形界面的 Linux 使用起来跟 Windows 其实没有太大差别,只是操作习惯不同而已,而且开发、调试、运行一体,毫无障碍。但是要使用 Linux 还得安装双系统或虚拟机啊,这两样我都不想做,而且毕竟 Windows 才是从小陪我们到的操作系统啊,所以我更倾向于在 Windows 下做开发。那么问题来了,在 Windows 下开发开发 Linux 程序是否可行呢?答案是肯定的。应该还是有不少解决方案呢吧,这里只介绍 WSL 方案。

WSL

WSL(Windows Subsystem for Linux),即 Windows 下的 Linux 子系统,具备完整的 Linux 生态,同时可以直接与 Windows 系统的硬盘交互。

安装 WSL

我们要安装的 WSL 版本为2.0,相比 WSL1.0 它具备更完整的 Linux 内核、托管 VM 和完全的系统调用兼容性。安装 WSL2.0 之前我们得先了解一下先决条件:

  • 不是所有的 Windows 操作系统都支持 WSL2.0 的,至少是 Windows 10 (1903以上) 以及 Windows 11 操作系统才可以。徽标键 + R 打开运行,输入 winver 可以检查 Windows 版本。
  • 你的计算机得支持 Hyper-V 虚拟化。

以上两个条件是安装 WSL2 的必须条件,如果不能同时满足则不能安装 WSL2,但或许可以安装 WSL1,不过那不在本文的研究范围之内,感兴趣的同学可以自行研究。

WSL2.0 的安装过程大概分为以下几个步骤:

  1. 启用 WSL
  2. 启用虚拟化支持
  3. 安装 WSL2 Linux 内核升级包
  4. 设置 WSL 2 为默认值
  5. 安装 Linux 发行版
启用 WSL

以管理员身份打开 PowerShell,运行以下命令:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

或者使用界面操作:控制面板 → 程序 → 程序和功能 → 启用或关闭Windows功能 → 适用于 Linux 的 Windows 子系统勾选。

启用虚拟机平台

同样是在 PowerShell 里执行命令:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

如果是早期的 Windows 10 (1903, 1909)  版本系统,请使用以下命令:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart

或者界面操作:控制面板 → 程序 → 程序和功能 → 启用或关闭Windows功能 → 虚拟机平台勾选。

这步操作完之后建议先重启系统,否则会出现后面的步骤无法执行的情况。当然你也可以先不重启,但当你遇到问题无法解决的时候切记先别四处寻找答案,不妨先重启一下试试,我在安装的过程好像重启了两次。 

 安装 WSL2 Linux 内核升级包

下载 wsl_update_x64.msi 并安装。

设置 WSL 2 为默认值

还是 PowerShell,执行命令:

wsl --set-default-version 2
 安装 Linux 发行版

这里的安装过程是要在微软商店(Microsoft Store)里进行的。输入 "linux" 关键字,就会出来很多操作系统,这里我们选择 Ubuntu 22.04.2 LTS,下载并安装即可。

到这里其实 WSL2 已经安装完成了,接下来就是使用 WSL 了。 

使用 WSL

查看已安装的 WSL 使用 PowerShell 命令:

wsl --list --verbose

 显示结果如下:

PS C:\WINDOWS\system32> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

可以看到刚刚安装的 Linux 系统,如果你安装了多个,则全部都会列出来。

从微软商店或开始菜单中启动之前安装的 Linux 系统,进入到系统界面,首次进入系统开始需要做一些配置,比如设置用户名、密码之类的。配置好之后,就可以正常使用 Linux 系统了。退出后再次进入后的界面如下:

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/helsing/.hushlogin file.
helsing@DESKTOP-HELSING:~$

因为我在首次进入系统时配置了新的用户名,所以打开系统后使用了我自定义的用户名,默认的可以使用 root 登录。

远程连接 WSL 

为什么要远程连接 WSL?因为后面在 Windows 的 IDE 下调试 Linux 必须远程连接到 Linux 系统,这也是我们安装 WSL 的原因啊。我们先尝试使用 PowerShell 本地登录 WSL:

PS C:\WINDOWS\system32> ssh root@localhost -p 2222

显示登录成功。我们用这个连接信息在 IDE 中登录,结果显示登录失败,说明 IDE 中得通过远程连接才可以。我们要查看一下 WSL 的 IP,使用命令 ifconfig,注意:要使用这个命令需要先安装 net-tools。

apt install net-tools

运行 ifconfig 命令得到 IP 为 172.23.143.94,就是 inet 后面的值。

root@DESKTOP-HELSING:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.23.143.94  netmask 255.255.240.0  broadcast 172.23.143.255
        inet6 fe80::215:5dff:feba:a089  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:ba:a0:89  txqueuelen 1000  (Ethernet)
        RX packets 90562  bytes 121907011 (121.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26563  bytes 25332553 (25.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1160  bytes 22589469 (22.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1160  bytes 22589469 (22.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

将 localhost 改为 IP,再进行登录尝试:

PS C:\WINDOWS\system32> ssh root@172.23.143.94 -p 2222

 登录不成功,显示信息如下:

ssh: connect to host 172.23.143.94 port 2222: Connection refused

报的是 ssh 的错误,所以登录不成功的原因有可能是未安装 ssh 或 ssh 未正确配置。

尝试重新安装 ssh:

apt-get remove openssh-server
apt-get install openssh-server

如果安装失败的话,可以尝试使用 apt-get update 命令,尝试更新修复后再重试。 

配置 ssh:

vim /etc/ssh/sshd_config

在 sshd_config 中修改或增加以下内容:

Port 2222 # 端口号(默认的22端口有可能被Windows另作他用了,为了避免端口冲突最好是改成别的)
ListenAddress 0.0.0.0 # 监听地址
PermitRootLogin yes # 允许使用root远程登录
PasswordAuthentication yes # 密码验证登录

配置完成后重启 ssh 服务:

service ssh restart

这时候再使用 PowerShell 进行远程登录,就显示登录成功了。

PS C:\WINDOWS\system32> ssh root@172.23.143.94 -p 2222
root@172.23.143.94's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Last login: Fri Nov 17 11:13:56 2023 from 172.23.128.1
root@DESKTOP-HELSING:~#

另外,网上看到有人说需要设置 Windows 的 SSH 功能,我好像没做这步操作,不过查看列表发现已经安装了。

如果你还未安装,可以参考以下方法:

Windows 10:设置 → 应用和功能 → 可选功能 → 添加应用 → OpenSSH 客户端

Windows 11:设置 → 可选功能 → 添加可选功能 → OpenSSH 客户端

IDE

前面我们说过了要在 Windows 下进行开发,那么 IDE 自然也是选择 Windows 下的了。这里我自然会选择宇宙最强之 IDE —— VS 了,毕竟之前玩 C# 就是一直用它的,熟悉的不能再熟悉了。不过如果你坚持要在 Linux 下进行开发,也可以了解一下 Linux 下的这些 IDE:

QT Creator

大名鼎鼎的 QT,不用我说了。

下载:点这里

 安装:

chmod +x qt-creator-opensource-linux-x86_64-7.0.2.run
./qt-creator-opensource-linux-x86_64-7.0.2.run
Visual Studio Code

一看就知道是 VS 系的,必须强大。

下载:点这里

 安装:

sudo dpkg -i code_1.84.2-1699528352_amd64.deb
CLion

 JetBrains 旗下的大作,用过 IDEA 的都知道这家公司,它家的 IDE 可以和微软的一教高下,并且一如既往的它家软件是要收费的。

下载:点这里

 安装:直接解压,设置桌面快捷方式 jetbrains-clion.desktop:

[Desktop Entry]
Name=CLion
Exec=${clion_install_path}/bin/clion.sh %f
Icon=${clion_install_path}/bin/clion.svg
Type=Application

将 ${clion_install_path} 替换为实际路径。

本节内容参考自 ᴇʀɪᴄ ᴛᴇᴏ 的博客文章

以上就是 Linux 下的 C++ IDE 了,其实在 Windos 下各家基本都有自己对应的产品,这里就不赘述了。后面的内容都是基于 VS IDE。 

创建项目

下面我们打开 VS,来创建我们的第一个 C++ 程序吧。

文件 → 新建 → 项目,选择 C++、Linux、控制台,设置项目名称,点击创建:

这样我们就创建好了一个 Linux C++ 控制台项目了,项目里面只有一个 main.cpp 文件,内容如下:

#include <cstdio>

int main()
{
    printf("%s 向你问好!\n", "HelloWorld");
    return 0;
}

我们将输出改成: 

 printf("%s\n", "Hello, World!");

点击调试运行,它会提示你要先创建一个 Linux 的远程连接,就是我们上面安装配置好的 WSL,将IP、端口号、用户名和密码等连接信息输入之后点确定即可。如果我们的 WSL 没有设置好远程访问,那么这个远程连接是创建不成功的。

配置成功后,打开项目的属性配置页,可以看到配置属性 远程生成计算机 的值变为 172.23.143.94 (username=root, port=2222, authentication=Password)。

再次点击调试运行,项目正常编译,且已成功连接上了 Linux 系统,但还是报错了:

g++ exited with code 1, please see the Output Window - Build

或者

g++已退出,代码为1,请查看输出窗口 - 生成输出,了解详细信息(注意: 若要在输出窗口中查看详细信息,则可能需要在工具选项中更改生成输出详细信息)。

网上有人说是 Windows Defender 或杀毒软件引起的,有的说是是 Linux 下的 g++ 不支持 C++11导致的,而我的原因其实很直接,那就是 WSL 上面压根儿没安装 g++ 造成的。

g++ -v
或
g++ --version

上述命令用于检测 g++ 是否已安装,如果没有安装,会提示“Command not found”,反之则会返回版本信息。

安装 g++
apt-get install gcc
apt-get install g++
apt-get install gdb
apt-get install gdbserver
或
yum install gcc
yum install g++
yum install gdb
yum install gdbserver

用哪种安装命令取决于你的 Linux 系列,这里不赘述了。

gcc:用于编译和链接 C 程序(g++ 依赖于 gcc,所以得先安装它)

g++:用于编译和链接 C++ 程序

gdb:用于本地调试 C/C++ 代码

gdbserver:用于远程调试 C/C++ 代码

安装完成之后,再此点击调试运行:

Linux 控制台成功输出信息,至此我们的 C++ 开发环境就部署完成了。 不过当我们在打开项目的时候,有可能会报一些错误:

xx.xx.xx.xx 缺少 zip:可能是在启动项目的时候做了什么跟 zip 有关的操作吧,那么我们在 WSL 上再把 zip 安装上去就可以了。

apt-get install zip

E0020    未定义标识符 "__builtin_free" :位置在外部依赖项的 stdio.h 文件下,__attr_dealloc_free 这个位置。这个字面意思就是标识符在使用之前尚未定义,这个错误我还没找到解决方法,不过并不影响程序运行,就暂时不管了。

#if defined __USE_MISC || defined __USE_XOPEN
/* Generate a unique temporary filename using up to five characters of PFX
   if it is not NULL.  The directory to put this file in is searched for
   as follows: First the environment variable "TMPDIR" is checked.
   If it contains the name of a writable directory, that directory is used.
   If not and if DIR is not NULL, that value is checked.  If that fails,
   P_tmpdir is tried and finally "/tmp".  The storage for the filename
   is allocated by `malloc'.  */
extern char *tempnam (const char *__dir, const char *__pfx)
   __THROW __attribute_malloc__ __wur __attr_dealloc_free;
#endif

老子说:“合抱之木,生于毫末;九层之台,起于垒土; 千里之行,始于足下。”【见《道德经》 第六十四章】

我始终觉得世上再难的事情都并非不可为,关键是要找到通往目标的途径。正所谓万事开头难,最难的并不是在既有道路上持续行走,而是寻找道路的过程。现在我们的道路很明确了,地基也打好了,九层之台指日可待了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/167041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IC卡操作软件支持PN532

IC卡操作软件&#xff0c;在知道卡片密码的情况下&#xff0c;可以对卡片修改数据&#xff0c;格式化清卡&#xff0c;修改UID卡和CUID卡的卡号&#xff0c;锁UFUID卡等 卡片dump文件拖进软件&#xff0c;即可打开文件&#xff0c;编辑修改文件&#xff0c;写卡&#xff0c;就…

asp.net校园二手交易平台系统VS开发sqlserver数据库web结构c#编程计算机网页

一、源码特点 asp.net校园二手交易平台系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 vs2010&#xff0c;数据库为sqlserver2008&a…

【ArcGIS】批量对栅格图像按要素掩膜提取

要把一张大的栅格图裁成分省或者分县市的栅格集&#xff0c;一般是用ArcGIS里的按掩膜提取。 但是有的时候所要求的栅格集量非常大&#xff0c;所以用代码来做批量掩膜&#xff08;按字段&#xff09;会非常方便。 import arcpy , shutil , os from arcpy import env from ar…

数据资产入表,给企业带来的机遇和挑战

作为推动数字经济发展的核心要素&#xff0c;近年来&#xff0c;数据资源对于企业特别是相关数据企业的价值和作用正日益凸显。 数据资产入表之后&#xff0c;能够为企业经营带来实质性的收益。“随着数据资产的纳入&#xff0c;企业的资产也出现了新标的。在资产负债表中&…

c语言:矩阵交换

题目&#xff1a; 代码和思路&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {int n 0;int m 0;int arr[10][10] { 0 }; // 输入行和列scanf("%d%d", &n, &m);int i 0;int j 0;//读取数组for (i 0; i < n; i)…

再见 Excel,你好 Python Spreadsheets!⛵

Excel是大家最常用的数据分析工具之一&#xff0c;借助它可以便捷地完成数据清理、统计计算、数据分析&#xff08;数据透视图&#xff09;和图表呈现等。 但是&#xff01;大家有没有用 Excel 处理过大一些的数据&#xff08;比如几十上百万行的数据表&#xff09;&#xff0…

这些PCB设计错误,依然有很多人再犯

在电子的设计制造中&#xff0c;PCB设计是至关重要的环节&#xff0c;尽管PCB设计的重要性得到了广泛认可&#xff0c;但依然有很多工程师在实践中犯下各种错误&#xff0c;本文凡小亿将盘点一些你没发现过的PCB设计错误&#xff0c;希望对小伙伴们有所帮助。 1、散热走线未能正…

四种方法,全面诊断库存管理的“死角”!

当今企业经营竞争环境的特点是&#xff1a;多品种、小批量、快速降价、产品生命周期短&#xff0c;这其实对企业的库存管理提出了高要求&#xff0c;库存在财务报表里是资产&#xff0c;但滞销&#xff08;或滞用&#xff09;的存货&#xff0c;就是将来要吃掉利润的成本&#…

idea项目中java类名出现带 j 小红点,如何解决?

目录 一、问题描述 二、问题解决方案 1、寻找异常问题 2、解决方案 2.1常规操作方法 2.2 快速操作方法 一、问题描述 一打开idea的java项目&#xff0c;发现所有的文件边上都有带J的大红点 虽然&#xff0c;在 git bash 中进行编译时无异常。 但是视觉上给人的感受就是…

如何自己生成fip.bin在Milkv-duo上跑freertos

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;本来是要跑RT-Thread的&#xff0c;搞了很久&#xff0c;一直没成功。哭死&#xff0c;后面mentor通电话&#xff0c;让我先跑一下freertos试试。有可能是因为RT-Th…

nginx学习(3)

Nginx 负载均衡 实战案例 实现效果 浏览器地址栏输入地址 http://172.31.0.99/oa/a.html&#xff0c;负载均衡效果&#xff0c;平均 8083 和 8084 端口中 一、配置 1、先创建2个文件夹&#xff0c;并将apache-tomcat-8.5.87解压到tomcat8083和tomcat8084中 &#xff08;或…

这8个Wireshark使用技巧,一看就会!

今天就给你分享8个常用的Wireshark使用技巧&#xff0c;一看就会。如果是处理 HTTP&#xff0c;HTTPS 大家还是用还是用 Fiddler&#xff0c;但如果是其他协议比如 TCP&#xff0c;UDP&#xff0c;还是用wireshark。 今天给你准备了wireshark和Fiddler的安装包给你&#xff0c…

湖科大计网:传输层

一、传输层概述 一、基本概念 传输层是端到端的协议。 因特网的两种不同的传输层协议&#xff1a; TCP&#xff1a;面向连接 UDP&#xff1a;无连接 我们在学习的过程中&#xff0c;只需要关注传输层之间的通信&#xff0c;不需要关注传输层协议数据是经过路由器转发至目的网络…

Python中用requests时遇到的错误警告解决方案

最近&#xff0c;我在Python 2.7.6&#xff08;Ubuntu 14.04.2 LTS&#xff09;环境中将requests库的版本从2.5.3升级到2.6.0&#xff0c;却遇到了’A true SSLContext object is not available’警告。每当我在Python 2.7.6环境中尝试使用requests库访问’github’时&#xff…

UDS寻址:物理寻址和功能寻址

ISO 15765-2中定义&#xff1a; 0x7DF通常是功能寻址请求。还有另外一组物理寻址的请求和响应。 ID 29bit的 低16 bit是TA和SA。高bit是车厂定义的。 功能寻址一般是18DBFFxx。物理寻址一般18DAxxxx。过滤还可以设置严格一点。

中小企业怎么实现数字化转型?有什么实用的工单管理系统?

当前&#xff0c;世界经济数字化转型已是大势所趋。在这个数字化转型的大潮中&#xff0c;如果企业仍然逆水而行&#xff0c;不随大流&#xff0c;那么&#xff0c;企业将有可能会被抛弃&#xff0c;被对手超越&#xff0c;甚至被市场边缘化&#xff0c;导致最终的结果是&#…

npm install 下载不下来依赖解决方案

背景 最近在构建 前端自动化部署 的方案中发现了一个问题&#xff0c;就是我在npm install的时候&#xff0c;有时候成功&#xff0c;有时候不成功&#xff0c;而且什么代码也没发生更改&#xff0c;报错也就是那么几个错&#xff0c;所以在此也整理了一下遇到这种情况&#xf…

Springcloud可视化物联网智慧工地云SaaS平台源码 支持二开和私有化部署

智慧工地平台围绕建筑施工人、物、事的安全管理为核心&#xff0c;对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场&#xff0c;紧紧围绕人、机、料、法、环等关键要素&#xff0c;综合运用物…

这5款好用的app,能让你生活质量和效率飙升

随着科技的进步和智能手机的普及&#xff0c;不少好用的手机APP出现让我们的生活更加便捷&#xff0c;也提升了我们的生活质量&#xff0c;带给我们不少惊喜。接下来&#xff0c;让我们一起探索这5款实用APP&#xff0c;看看有没有适合你的&#xff01; 1、粉笔 一款专门备考…

外贸自建站什么意思?自建独立网站的好处?

外贸自建站的含义是什么&#xff1f;如何区分自建站和独立站&#xff1f; 随着全球贸易的不断发展&#xff0c;越来越多的企业开始关注外贸自建站。那么&#xff0c;“外贸自建站”到底是什么意思呢&#xff1f;海洋建站将为您详细解析这个问题&#xff0c;带您深入了解这一新…