自从用上python和java后,c和c++就已经很少接触了。结果最近面试在复习整理的时候发现很多c++的知识都忘得差不多了,有必要再重新拿起来掌握一番。因为疫情的缘故我的PC隔着我五百多公里,看来只能用老家的xp电脑了。首先去把系统刷到win10,然后在这白板电脑上开始从0搭建c++环境。
设备情况
- 操作系统:原xp现为win10专业版32位
- 硬件设施:i3 350+4G内存
- 基础环境:啥都没有
方案选择
windows做编程环境方案还挺多,大概可以分成以下三种:
- 集成编译开发环境IDE一招解决
- 自行配置编译工具+编辑器/IDE
- 模拟其它系统搭建环境
- 使用IDE。IDE是封装了编辑、编译、运行和调试等步骤的产品,提供开发程序的一站式体验,让广大程序员不必分心到这些非代码质量方面的问题,不仅是初学者的福音,也是现在程序开发的绝对主流。(想当初学校考试叫我们用linux手动编译调试,简直是噩梦T_T)。可供使用的IDE包括以下几种:
- 傻瓜式IDE,包括dev c++,code::blocks和Wintc等。这几个软件轻量而简单,自带编译工具,下载解压就能用,非常适合教学或者做点小程序,我猜这几个也是不少人的编程引路人吧。他们的缺点也很明显,非常非常的老非常非常的丑,而开发工具要的就是与时俱进,所以,过去的事物就让他们过去吧。
- 永远滴神Visual Studio,完备的开发工具集,功能强大的代价是体量也很大,对硬件要求也比较高,当年学cuda的时候经常报奇奇怪怪的错误。看到家里这笨笔的32位电脑,只能含泪放弃……
- 自由跨平台IDE,包括VScode和Eclipse,他们的特点是开源免费多平台可用(vs虽然无敌但是只能在windows跑啊),本身只提供编辑器功能但是支持插件使用,还有丰富的软件生态,个人感觉这种组件式的开发工具集算是现在的使用潮流吧,毕竟可以按需扩展功能,也是我现在使用的IDE类型。
- 模拟其它系统,这里主要讲子系统WSL(windows subsystem for linux)。怎么说呢,windows不开源导致很多东西不给你看不给你用,就很气。或许微软也看到了这个问题,这几年搞了个子系统,支持在win上使用各种linux发行版的shell而且把自己挂载到了其文件系统中。我自己的电脑上也弄了一个,很方便,可惜老家32位电脑不支持。
- 终于在尝试其他方案失败后,我选择使用IDE+编译工具的方案。
编译工具的选择
编译工具个人认为是开发环境中的核心,包括了编译器和各种库文件。对于编译器来说,最常用也是最熟悉的肯定是GNU的gcc和g++了,但是他们原来是在unix环境下编译出来的,在win32里不能通过。主要有一下三种方案:
- 微软自己做一个win专用的,于是有了MSVC。
- 修改翻译器把win32平台没有的翻译成等价形式,于是有了MinGW。
- 修改库,用win32的api提供类似unix程序的接口给编译器,于是有了Cygwin。
虽然MSVC在win上很常见,打游戏时经常需要他们的库,但是不适合跨平台啊。剩下的话因为我以前以来用的就是MinGW用惯了,网上说cygwin的安装更简便一些,但我个人觉得MinGW也难不到哪里去啊233。
最后我选择使用的是MinGW-W64,是非原开发者做的一个升级版,在原版基础上增加了对64位的适配,还支持32位和64位的交叉编译,就很牛逼。这其中还有个有趣的逸闻,新版的开发者当时用旧版有适配问题去问旧版的维护人员,得到的冷淡答复让他很不开心,然后就自己做了这个新版,然后很搞笑的是只有新版有gcc官方支持的,旧版没有,然后新版旧版现在都有人在维护,算是同行冤家吧,嘻嘻.
MinGW-W64的安装配置
打开MinGW-W64官网,点击右上角的downlaod得到如下界面:
Pre-built toolchains and packages指的是预编译好的包,选择好系统然后下载一个官方下载器就是了。我这边因为笨比的移动宽带,下载时会报错cannot download repository.txt
,仓库目录都下不了了那下个毛线啊?那就只能离线下载全部的源文件了。在下面的Sources里找到他们源码的下载网站Sourceforge,略过上面的源码目录,拉到最下面,有编译好的压缩文件:
x86-64对应64位,i686对应32位这都好说。后面还有两段参数可以简要讲一下:
- posix和win32,对应的是支持posix标准、可移植操作api的系统(类unix)和不支持posix的win32平台。posix创建进程的时候会让linux和win统一封装成相同函数方便移植,若想单独在win32开发就选后者。
- sjlj,seh和dwarf,对应的是不同的异常处理模型,就是实现try,throw,catch的方式。sjlj是Set jump long jump,就是设还原点和还原点跳转,最经典原始也最慢;seh是微软买了专利权使用的技术,把还原点压入FS段寄存器的,最近才专利失效给大家用,性能好;dwarf是mingw自己搞出来以替代seh的方案,但是不支持32位。根据我这电脑的情况最后决定下载posix-sjlj方案的编译工具。
sourceforge下载很慢很慢,建议挂梯子~之后就是常规操作,把包解压然后将里面的bin目录添加到环境变量里面。设好环境变量要去终端里试试是否有效,这是好习惯。
vscode的配置
去官网下载好vscode,在左侧的竖条菜单栏找扩展,先去搜索下载好Chinese Simplified Language,C/C++和code runner三个组件。重启看到中文界面。然后在资源管理器中找到你的工作目录,新建.vscode文件夹,里面添加launch.json,tasks.json,settings.json这三个配置相关的文件,加入如下代码(如果已经有了的话就看key值酌情修改)
- settings.json
{
"files.associations": {
"ostream": "cpp",
"iostream": "cpp",
"new": "cpp"
}
}
- launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
"type": "cppdbg", // 配置类型,这里只能为cppdbg
"request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
"program": "${workspaceRoot}/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径
"args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false
"cwd": "${fileDirname}",// 调试程序时的工作目录,一般为${workspaceRoot}即代码所在目录
"environment": [],
"externalConsole": true,// 调试时是否显示控制台窗口,一般设置为true显示控制台
"MIMode": "gdb",
"miDebuggerPath": "F:\\minGW-w64\\bin\\gdb.exe",// miDebugger的路径,注意这里要与MinGw的路径对应
"preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
- tasks.json
{
"version": "2.0.0",
"command": "g++",
"args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.exe"], // 编译命令参数
"problemMatcher": {
"owner": "cpp",
"fileLocation": ["relative", "${workspaceFolder}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared", //这里shared表示共享,改成new之后每个进程创建新的端口
"showReuseMessage": true,
"clear": false
}
}
只有一个要注意的点是launch.json里miDebuggerPath对应的值要自己修改成mingw中gdb.exe所在的路径。这样之后一般情况就可以打代码写程序了。但是这样做有一个不好的点,就是vscode运行编译好的exe程序会弹出系统的cmd窗口而不是自带的终端,这么弄俩窗口切来切去挺不方便的,然后code runner就出现了。
插件下好后按ctrl+逗号打开设置,找到在settings.json中编辑的地方并打开,在大括号中加入如下键值对:
"code-runner.runInTerminal": true,
"code-runner.ignoreSelection": true,
"code-runner.executorMap": {
"javascript": "node",
"java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $fileNameWithoutExt",
"objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"php": "php",
"python": "python -u",
"perl": "perl",
"perl6": "perl6",
"ruby": "ruby",
"go": "go run",
"lua": "lua",
"groovy": "groovy",
"powershell": "powershell -ExecutionPolicy ByPass -File",
"bat": "cmd /c",
"shellscript": "bash",
"fsharp": "fsi",
"csharp": "scriptcs",
"vbscript": "cscript //Nologo",
"typescript": "ts-node",
"coffeescript": "coffee",
"scala": "scala",
"swift": "swift",
"julia": "julia",
"crystal": "crystal",
"ocaml": "ocaml",
"r": "Rscript",
"applescript": "osascript",
"clojure": "lein exec",
"haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
"rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
"racket": "racket",
"ahk": "autohotkey",
"autoit": "autoit3",
"dart": "dart",
"pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
"d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
"haskell": "runhaskell",
"nim": "nim compile --verbosity:0 --hints:off --run",
"lisp": "sbcl --script",
"kit": "kitc --run"
},
看到那一长排的命令脚本设置了吗,coderunner其实就是按照这些设置自动执行里面的命令进行编译。"code-runner.runInTerminal": true,
令它可以在内置的终端中运行。
回到自己打的代码,右键run code,就可以在便捷的在内置终端查看运行结果啦~
最后说一下,coderunner只用来跑代码不能调试,要调试还是乖乖F5吧!
番外:Clion在32位系统上运行
学习python的时候接触到了jetbrain家的pycharm,惊为天人,还有他们家的IDEA也是一款非常优秀的java开发IDE,直接对标老牌的Eclipse。大三的时候发现jetbrain可以依靠学生身份申请一年的全家桶免费使用权,人家白送的不要白不要?全家桶里用来开发C/C++的玩意叫clion,算挺年轻的一款产品,画风和他们家兄弟如出一辙,听上去还不错,可是人家天生就不支持32位系统……
但那怎么能阻止我们白嫖的脚步?现在在不用过期了不久浪费了吗!接下来是让Clion在32位电脑上运行的设置步骤:
下载解压
去官网下好文件(网速慢就上梯),用压缩文件的管理界面定位到安装包并解压,是的解压而不是运行(废话32位的直接运行不了),得到clion的文件目录:
删除jre
文件目录中有个jbr文件夹,打开之后发现有点熟悉,再点开里面的bin文件夹可以看到里面有java.exe,对的这是clion自带的java,在这里打开cmd运行java会报错版本不兼容,说明这是64位的,那我换还不行吗?删除这玩意然后自己上网下好32位的jdk8,设好环境变量。
修改参数
回到根目录,打开bin文件夹,里面放着各种可执行程序。clion64.exe是肯定打不开了,需要修改的是其他文件。
- 首先记事本打开*clion64.exe.vmoptions *,在最后一行加入
-Didea.no.64bit.check=true
,让它能在非64位系统情况下可以进行开启前自检,不加这一行会导致启动失败,找不到jdk
- 在系统环境变量中添加新变量_JAVA_OPTIONS(注意一开始的_),值为-Xmx900M,这样规定了java运行时的最大内存用量900m,因为32位系统内存封顶也就4G,撇开系统占的三分之二还有你开着的qq网页clion等进程剩下的已经不多了,这样设才不会卡死。
- 找到clion.bat文件,首先用记事本打开它,把第一句
@echo off
这句话删掉,这样跑脚本的时候程序会把跑的那句话回显到终端上,方便我们发现问题。然后打开终端,运行此bat脚本(不要直接双击,不然会一闪而过就没了)。滚出一大堆命令,从中耐心的跳出ERROR语句然后自己手动解决就是了。要注意的是启动脚本里面有很多替代检查选项,这个检查出现error它会去找替代品继续检查,有就ok,所以不是所有的ERROR都是导致起动失败的元凶。一般找到最后一个ERROR就是元凶了,像我就是这样:
脚本找不到jdk,我查了一下原来是我设置JAVA_HOME设为java.exe所在的bin目录了,真是笨比。这样可以修改正确的环境变量,或者在bat里加入SET JDK_HOME=java目录
,最后就可以启动成功了:
- 工具配置。初次打开clion它会报错下面这几个玩意找不到,要你自己填,那填就是了。其实环境、编译器、gdb都没有问题,错在cmake它默认用的是bundle自带捆绑的玩意,那用不了也是可以理解。自己去网上下好cmake并安装(推荐下.msi的,有安装向导还帮你设环境变量),然后再设置就不会报错了,像我这样:
然后就可以愉快的用clion编程啦!其实也并没有多愉快,毕竟强扭的瓜不甜。单开一个软件还好,我写博客的时候vscode、网页、clion、tim一起开直接卡的要命,但也没办法,这就是时代弃儿的命运。以后有机会了可以去阿里云用学生优惠买一台ecs云服务器,然后就可以用ssh来进行开发了,岂不美哉~