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

news2024/9/22 7:21:05

在我还在做后端的时候,当时程序员圈里就有个梗很火,说的是当时几种常用编程语言的鄙视链:做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.coloradmin.cn/o/1229215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IC卡操作软件支持PN532

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

一文读懂:为什么GPU比CPU更快?

大家好&#xff0c;我是老猫&#xff0c;猫头鹰的猫。 在过去几十年里&#xff0c;GPU变得越来越流行&#xff0c;尤其是最近ChatGPT大火&#xff0c;背后训练大模型的硬件设备GPU达到了一片难求的地步。 你有没有好奇&#xff1a;为什么必须要用GPU&#xff1f;CPU被淘汰了吗…

Polygon Miden VM中的哈希函数对比

1. 引言 在Polygon Miden VM中&#xff0c;使用了多个不同的哈希函数&#xff1a; 1&#xff09;“传统”哈希函数&#xff0c;如BLAKE3&#xff1a;对STARK之外的性能进行了优化。2&#xff09;algebraic哈希函数&#xff0c;如Rescue Prime&#xff1a;对STARK内部优化&…

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

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

非遗拓鱼丨以传统文化助力守护美丽长江

长江生物多样性极为丰富&#xff0c;是中华民族赖以生存的生命之源&#xff0c;值得人类更多的关注与保护。为传播非遗文化、宣传长江生态保护&#xff0c;积极响应野生动物保护宣传的号召&#xff0c;以非遗手工助力守护长江&#xff0c;11月18日&#xff0c;在重庆市陆海国际…

[解决] 问题:ImportError: cannot import name ‘Callable‘ from ‘collections‘

问题 我在运行yolov8的代码时&#xff0c;出现了ImportError: cannot import name Callable from collections的错误 原因 版本问题:以下collections的方法都在Python3.10版本后被取消了 ["Awaitable", "Coroutine", "AsyncIterable", "A…

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

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

mybatisPlus的简单使用

封装实体类 编写Mapper service层 controller层

图片地址GPS经纬度查询

先打开exif图片查询的网站&#xff1a; 改图宝的&#xff1a;https://www.gaitubao.com/exif图虫de的:EXIF信息查看器 (tuchong.com) 将这个地点&#xff1a;51 deg 30 51.90" N, 0 deg 5 38.73" W 修改为&#xff1a;5130 51.90" N, 05 38.73" W 到谷…

优步让一切人工智能化

优步(Uber)的商业模式建立在对数据的颠覆性使用上--通过将双方智能手机的位置数据关联起来&#xff0c;将出租车司机与乘客配对。这意味着&#xff0c;它可以比传统出租车公司更快地安排司机去接乘客&#xff0c;极大地冲击了传统出租车公司的业务。 优步自成立以来&#xff0…

MySQL 之多版本并发控制 MVCC

MySQL 之多版本并发控制 MVCC 1、MVCC 中的两种读取方式1.1、快照读1.2、当前读 2、MVCC实现原理之 ReadView2.1、隐藏字段2.2、ReadView2.3、读已提交和可重复读隔离级别下&#xff0c;产生 ReadView 时机的区别 3、MVCC 解决幻读4、总结 MVCC&#xff08;多版本并发控制&…

国外客户发开发信怎么发?写外贸邮件方法?

如何给国外客户发开发信&#xff1f;给老外发外贸开发信的技巧&#xff1f; 与国外客户保持联系并积极开展业务合作变得至关重要。一种有效的方式是通过发展信件&#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)…

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;或…

Linux中安装部署环境(JAVA)

目录 在Linux中安装jdk 包管理器yum安装jdk JDK安装过程中的问题 验证安装jdk 在Linux中安装tomcat 安装mysql 在Linux中安装jdk jdk在Linux中的安装方式有很多种, 这里介绍最简单的方法, 也就是包管理器方法: 包管理器yum安装jdk Linux中常见的包管理器有: yumaptp…

Nginx部署前端项目

Nginx部署前端项目 1.在nginx官网http://nginx.org/en/download.html &#xff0c;下载稳定版本&#xff1a; 2.解压后&#xff0c;点击根目录中的nginx.exe即可启动Nginx&#xff0c;或是在nginx安装目录中启动cmd并输入以下命令启动&#xff1a; nginx.exe 或 start nginx3…

本地部署 EmotiVoice易魔声 多音色提示控制TTS

本地部署 EmotiVoice易魔声 多音色提示控制TTS EmotiVoice易魔声 介绍ChatGLM3 Github 地址部署 EmotiVoice准备模型文件准备预训练模型推理 EmotiVoice易魔声 介绍 EmotiVoice是一个强大的开源TTS引擎&#xff0c;支持中英文双语&#xff0c;包含2000多种不同的音色&#xff…

深信服测开实习

感觉会有人对这种类型的博客感兴趣&#xff0c;所以想了想还是发上来了。 今天早上十点收到了通知&#xff0c;这周五报道。 大致说工作时长&#xff1a; 周一到周五 一二四 早上九点到中午十二点。两小时午休。下午两点到晚上六点半。一小时晚休。七点半到晚上八点半下班。三…

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

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

蔡崇信看好的菜鸟,“基本面”究竟如何?

今年5月,阿里巴巴集团曾公布云智能集团将完全分拆独立走向上市&#xff0c;菜鸟、盒马启动上市计划&#xff0c;国际数字商业集团启动外部融资。但随着16日阿里巴巴集团最新财报的发布&#xff0c;及宣布终止分拆阿里云、盒马IPO搁置&#xff0c;现在&#xff0c;仅有菜鸟在按原…