windows平台搭建c++环境笔记

自从用上python和java后,c和c++就已经很少接触了。结果最近面试在复习整理的时候发现很多c++的知识都忘得差不多了,有必要再重新拿起来掌握一番。因为疫情的缘故我的PC隔着我五百多公里,看来只能用老家的xp电脑了。首先去把系统刷到win10,然后在这白板电脑上开始从0搭建c++环境。

设备情况

  • 操作系统:原xp现为win10专业版32位
  • 硬件设施:i3 350+4G内存
  • 基础环境:啥都没有

方案选择

windows做编程环境方案还挺多,大概可以分成以下三种:

  • 集成编译开发环境IDE一招解决
  • 自行配置编译工具+编辑器/IDE
  • 模拟其它系统搭建环境
  1. 使用IDE。IDE是封装了编辑、编译、运行和调试等步骤的产品,提供开发程序的一站式体验,让广大程序员不必分心到这些非代码质量方面的问题,不仅是初学者的福音,也是现在程序开发的绝对主流。(想当初学校考试叫我们用linux手动编译调试,简直是噩梦T_T)。可供使用的IDE包括以下几种:
    • 傻瓜式IDE,包括dev c++,code::blocksWintc等。这几个软件轻量而简单,自带编译工具,下载解压就能用,非常适合教学或者做点小程序,我猜这几个也是不少人的编程引路人吧。他们的缺点也很明显,非常非常的老非常非常的丑,而开发工具要的就是与时俱进,所以,过去的事物就让他们过去吧。
    • 永远滴神Visual Studio,完备的开发工具集,功能强大的代价是体量也很大,对硬件要求也比较高,当年学cuda的时候经常报奇奇怪怪的错误。看到家里这笨笔的32位电脑,只能含泪放弃……
    • 自由跨平台IDE,包括VScodeEclipse,他们的特点是开源免费多平台可用(vs虽然无敌但是只能在windows跑啊),本身只提供编辑器功能但是支持插件使用,还有丰富的软件生态,个人感觉这种组件式的开发工具集算是现在的使用潮流吧,毕竟可以按需扩展功能,也是我现在使用的IDE类型。
  2. 模拟其它系统,这里主要讲子系统WSL(windows subsystem for linux)。怎么说呢,windows不开源导致很多东西不给你看不给你用,就很气。或许微软也看到了这个问题,这几年搞了个子系统,支持在win上使用各种linux发行版的shell而且把自己挂载到了其文件系统中。我自己的电脑上也弄了一个,很方便,可惜老家32位电脑不支持。
  3. 终于在尝试其他方案失败后,我选择使用IDE+编译工具的方案。

编译工具的选择

编译工具个人认为是开发环境中的核心,包括了编译器和各种库文件。对于编译器来说,最常用也是最熟悉的肯定是GNU的gcc和g++了,但是他们原来是在unix环境下编译出来的,在win32里不能通过。主要有一下三种方案:

  1. 微软自己做一个win专用的,于是有了MSVC。
  2. 修改翻译器把win32平台没有的翻译成等价形式,于是有了MinGW
  3. 修改库,用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位这都好说。后面还有两段参数可以简要讲一下:

  1. posix和win32,对应的是支持posix标准、可移植操作api的系统(类unix)和不支持posix的win32平台。posix创建进程的时候会让linux和win统一封装成相同函数方便移植,若想单独在win32开发就选后者。
  2. 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 LanguageC/C++code runner三个组件。重启看到中文界面。然后在资源管理器中找到你的工作目录,新建.vscode文件夹,里面添加launch.json,tasks.json,settings.json这三个配置相关的文件,加入如下代码(如果已经有了的话就看key值酌情修改)

  1. settings.json
{
    "files.associations": {
        "ostream": "cpp",
        "iostream": "cpp",
        "new": "cpp"
    }
}
  1. 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
                }
            ]
        }
    ]
}
  1. 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是肯定打不开了,需要修改的是其他文件。

  1. 首先记事本打开*clion64.exe.vmoptions *,在最后一行加入-Didea.no.64bit.check=true,让它能在非64位系统情况下可以进行开启前自检,不加这一行会导致启动失败,找不到jdk

  2. 在系统环境变量中添加新变量_JAVA_OPTIONS(注意一开始的_),值为-Xmx900M,这样规定了java运行时的最大内存用量900m,因为32位系统内存封顶也就4G,撇开系统占的三分之二还有你开着的qq网页clion等进程剩下的已经不多了,这样设才不会卡死。
  3. 找到clion.bat文件,首先用记事本打开它,把第一句@echo off这句话删掉,这样跑脚本的时候程序会把跑的那句话回显到终端上,方便我们发现问题。然后打开终端,运行此bat脚本(不要直接双击,不然会一闪而过就没了)。滚出一大堆命令,从中耐心的跳出ERROR语句然后自己手动解决就是了。要注意的是启动脚本里面有很多替代检查选项,这个检查出现error它会去找替代品继续检查,有就ok,所以不是所有的ERROR都是导致起动失败的元凶。一般找到最后一个ERROR就是元凶了,像我就是这样:


    脚本找不到jdk,我查了一下原来是我设置JAVA_HOME设为java.exe所在的bin目录了,真是笨比。这样可以修改正确的环境变量,或者在bat里加入SET JDK_HOME=java目录,最后就可以启动成功了:


  4. 工具配置。初次打开clion它会报错下面这几个玩意找不到,要你自己填,那填就是了。其实环境、编译器、gdb都没有问题,错在cmake它默认用的是bundle自带捆绑的玩意,那用不了也是可以理解。自己去网上下好cmake并安装(推荐下.msi的,有安装向导还帮你设环境变量),然后再设置就不会报错了,像我这样:


    然后就可以愉快的用clion编程啦!其实也并没有多愉快,毕竟强扭的瓜不甜。单开一个软件还好,我写博客的时候vscode、网页、clion、tim一起开直接卡的要命,但也没办法,这就是时代弃儿的命运。以后有机会了可以去阿里云用学生优惠买一台ecs云服务器,然后就可以用ssh来进行开发了,岂不美哉~

猜你喜欢

转载自www.cnblogs.com/joufulmika/p/12716400.html
今日推荐