如何打造随身编译环境(vscode)(更新)

如何打造随身编译环境(vscode)(更新)

本文能够实现的是:比如u盘吧,插上u盘,然后点开code.exe,然后敲代码运行,换几个电脑都是这样,可以插上电脑就用。注意的是要用4K速度比较高的移动设备,不然编译打开啥的速度可能比较慢

这个弄了我好久qwq,走了很多弯路

1.非便携编译

首先先简单说一下在固定的windows中如何使用vscode编译,应该有4种方法,我只用过两种,说一下利弊,第一种是配置任务json文件,具体可以网上查,弊端就是每个目录下都要配置这些文件,不方便,所以我经常用的还是用插件,coderunner

这个插件的核心就是给定指定的cmd命令,然后运行,各种语言默认的cmd命令如下:

然后这里面会有一些预定的变量:

比如$dir这些的,都是预定的变量,$dir表示的就是当前文件所在的路径(有外引号)

同样的,可以查看vscode官方文档,这个很重要,这些是后面json文件配置的前提

  • $workspaceRoot: The path of the folder opened in VS Code
  • $dir: The directory of the code file being run
  • $dirWithoutTrailingSlash: The directory of the code file being run without a trailing slash
  • $fullFileName: The full name of the code file being run
  • $fileName: The base name of the code file being run, that is the file without the directory
  • $fileNameWithoutExt: The base name of the code file being run without its extension
  • $driveLetter: The drive letter of the code file being run (Windows only)
  • $pythonPath: The path of Python interpreter (set by Python: Select Interpreter command)

vsocode预定义变量:https://code.visualstudio.com/docs/editor/variables-reference

然后具体的怎么用就不说了,之前另外一篇文章说过了,之后就是本文章的重点了

2.便携vscode编译

首先下载vscode便携版,直接在vscode的官网下载就行:vscode便携版

然后现在会有几个问题:

1)默认的扩展目录问题

因为vscode的默认扩展所在目录在C盘的user文件夹下,所以这个是为了达到便携版的第一个问题,也就是要想办法移动vscode识别扩展文件的路径

2)setting.json,用户设置问题

同样的,这个文件在C盘的Roming下,所以也要处理路径问题

3)编译器

这个地方,我之前看网上给出有一种是用bat脚本来直接设置环境变量,这个其实我觉得不太好,因为它会影响本机的环境变量,用环境变量就会很简单,而不用环境变量,会有些麻烦,举个例子,用环境变量,直接g++,java,javc,python就行了,但是现在没有这些,所以需要处理coderunner的cmd命令

首先先下载编译软件:(MinGW真的麻烦qwq)

  • C++:MinGW
  • Java:JDK
  • Python:Python 3.7

关于编译器的使用方法,本人只会简单的:

MinGW

g++ test.cpp -o test -static-libgcc -static-libstdc++

MinGW一定要加上-static-libgcc -static-libstdc++ ,这个是静态链接,如果直接g++ -o的话,如果文件不在bin目录下,就会丢失dll文件,所以一定要静态链接,并且MinGW很🐕,必须要到bin下才能使用,所以json里面会写的比较长,比较麻烦

JDK就方便了

java test.java 
java test 

python同样很方便

python -u test.py

然后就是处理这些问题,首先处理路径的问题,这个找了好久才找到方法:

在便携式vscode的目录下创建data文件夹,给出VSCode便携版的目录:

|- VSCode-win32-x64-1.25.0-insider
|   |- Code.exe (or code executable)
|   |- data
|   |   |- user-data
|   |   |   |- ...
|   |   |- extensions
|   |   |   |- ...
|   |- ...

并且可以顺带在data文件夹下创建一个tmp文件夹,这样的话,临时文件也会保存在这个地方

处理完路径之后就是编译的问题了

目前我还没有很方便的方法,因为vscode的预定义变量里面没有绝对路径的方法,只能用相对路径,所以暂时无法实现任意workspace中编译

给出目前我的目录结构:

|- Code
|   |- MinGW
|   |- JDK64
|   |- python37
|   |- workspace_1
|   |- workspace_2
|   |- workspace_3
...
|   |- workspace_n

然后我的setting.json文件(注意!!!每个人的不一样,要自己写一个,注意路径问题,如果采用我上面的目录结构的话,这样就可以了)如下:

{
    "code-runner.executorMap": {
        "cpp" : "cd $dir ; cd ..\\MinGW\\bin ; .\\g++ $workspaceRoot\\$fileName -o $workspaceRoot\\$fileNameWithoutExt -static-libgcc -static-libstdc++ ; cd $dir ; .\\$fileNameWithoutExt" ,
        "java": "cd $dir ; ..\\JDK64\\bin\\javac $fileName ; ..\\JDK64\\bin\\java $fileNameWithoutExt",
        "python": "cd $dir ; ..\\python37\\python -u $fileName"
    },
    "C_Cpp.default.includePath": [
        "${workspaceFolder}/**",
        "${workspaceFolder}/../MinGW/include/**",
        "${workspaceFolder}/../MinGW/lib/gcc/mingw32/8.2.0/include/**"
    ],
    "C_Cpp.default.compilerPath" : "${workspaceFolder}/../MinGW/bin/g++.exe",
    "workbench.iconTheme": "vscode-icons",
    "editor.fontSize": 16,
    "code-runner.ignoreSelection": true,
    "code-runner.saveFileBeforeRun": true,
    "code-runner.runInTerminal": true,
    "code-runner.preserveFocus": false,
    "files.exclude": {
        "**/.classpath": true,
        "**/.project": true,
        "**/.settings": true,
        "**/.factorypath": true
    }
}

扩展文件如何在json中写,参考官方文档: https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp

给出效果图:

关于找不到stdc++文件的问题,创建bits文件夹然后塞进去就行了,注意includePath路径问题,上一次文章中说了,还有C++11问题,在C++扩展中打开就行了,包括C99,上次都写了,不理解的话,上网查一下就好啦

然后就happy了~~~~速度主要看自己移动设备的4k随机读写速度,比较建议使用固态u盘或者移动ssd

3. 8.17号更新(使用绝对路径,更加灵活的工作区):

之前没看清楚预定的变量,完全可以使用绝对路径,coderunner预定了变量$driveLetter

{
    "code-runner.executorMap": {
        // -- 相对路径的设置
        // "cpp" : "cd $dir ; cd ..\\MinGW\\bin ; .\\g++ $workspaceRoot\\$fileName -o $workspaceRoot\\$fileNameWithoutExt -static-libgcc -static-libstdc++ ; cd $dir ; .\\$fileNameWithoutExt" ,
        // "java": "cd $dir ; ..\\JDK64\\bin\\javac $fileName ; ..\\JDK64\\bin\\java $fileNameWithoutExt",
        // "python": "cd $dir ; ..\\python37\\python -u $fileName"

        // -- 绝对路径的设置
        "cpp" : "cd $driveLetter\\DO\\Other_App\\Code\\MinGW\\bin ; .\\g++ $workspaceRoot\\$fileName -o $workspaceRoot\\$fileNameWithoutExt -static-libgcc -static-libstdc++ ; cd $dir ; .\\$fileNameWithoutExt",
        "java" : "cd $dir ; $driveLetter\\DO\\Other_App\\Code\\JDK64\\bin\\javac $fileName ; $driveLetter\\DO\\Other_App\\Code\\JDK64\\bin\\java $fileNameWithoutExt",
        "python" : "cd $dir ; $driveLetter\\DO\\Other_App\\Code\\python37\\python -u $fileName"
    },
    "C_Cpp.default.includePath": [
        "${workspaceFolder}/**",
        // -- 相对路径的设置方法
        // "${workspaceFolder}/../MinGW/include/**",
        // "${workspaceFolder}/../MinGW/lib/gcc/mingw32/8.2.0/include/**",

        // -- 绝对路径的设置方法
        "${execPath}/../../Other_App/Code/MinGW/include/**",
        "${execPath}/../../Other_App/Code/MinGW/lib/gcc/mingw32/8.2.0/include/**"
    ],
    "C_Cpp.default.compilerPath" : "${workspaceFolder}/../MinGW/bin/g++.exe",
    "workbench.iconTheme": "vscode-icons",
    "editor.fontSize": 16,
    "code-runner.ignoreSelection": true,
    "code-runner.saveFileBeforeRun": true,
    "code-runner.runInTerminal": true,
    "code-runner.preserveFocus": false,
    "files.exclude": {
        "**/.classpath": true,
        "**/.project": true,
        "**/.settings": true,
        "**/.factorypath": true
    },
    "C_Cpp.updateChannel": "Insiders",
    "C_Cpp.default.cppStandard": "c++11",
    "C_Cpp.default.intelliSenseMode": "gcc-x64"
}

给出我的u盘的目录结构:

|- U盘Driver
|   |- DO
|   |   |- Other_App
|   |   |   |- Code
|   |   |   |   |- JDK64
|   |   |   |   |- MinGW
|   |   |   |   |- python37

但是会发现includePath使用${execPath}没有用,原因可能是${execPath}的路径包括Code.exe,这样就无法使用..了,因为Code.exe里面并没有目录..(上级目录)

但是可以用一种方法,因为

c/ = c/../../../ ...... /../../

所以只要你创建的文件位置深度不超过创建的..的个数就行了

{
    "code-runner.executorMap": {
        // -- 相对路径的设置
        // "cpp" : "cd $dir ; cd ..\\MinGW\\bin ; .\\g++ $workspaceRoot\\$fileName -o $workspaceRoot\\$fileNameWithoutExt -static-libgcc -static-libstdc++ ; cd $dir ; .\\$fileNameWithoutExt" ,
        // "java": "cd $dir ; ..\\JDK64\\bin\\javac $fileName ; ..\\JDK64\\bin\\java $fileNameWithoutExt",
        // "python": "cd $dir ; ..\\python37\\python -u $fileName"

        // -- 绝对路径的设置
        "cpp" : "cd $driveLetter\\DO\\Other_App\\Code\\MinGW\\bin ; .\\g++ $workspaceRoot\\$fileName -o $workspaceRoot\\$fileNameWithoutExt -static-libgcc -static-libstdc++ ; cd $dir ; .\\$fileNameWithoutExt",
        "java" : "cd $dir ; $driveLetter\\DO\\Other_App\\Code\\JDK64\\bin\\javac $fileName ; $driveLetter\\DO\\Other_App\\Code\\JDK64\\bin\\java $fileNameWithoutExt",
        "python" : "cd $dir ; $driveLetter\\DO\\Other_App\\Code\\python37\\python -u $fileName"
    },
    "C_Cpp.default.includePath": [
        "${workspaceFolder}/**",
        // -- 相对路径的设置方法
        // "${workspaceFolder}/../MinGW/include/**",
        // "${workspaceFolder}/../MinGW/lib/gcc/mingw32/8.2.0/include/**",

        // -- 绝对路径的设置方法
        // "${execPath}/**",
        // "${execPath}/../../Other_App/Code/MinGW/include/**",
        // "${execPath}/../../Other_App/Code/MinGW/lib/gcc/mingw32/8.2.0/include/**"
        
        // -- 绝对路径2
        "${workspaceFolder}/../../../../../../../../../DO/Other_App/Code/MinGW/include/**",
        "${workspaceFolder}/../../../../../../../../../../../DO/Other_App/Code/MinGW/lib/gcc/mingw32/8.2.0/include/**"
    ],
    "C_Cpp.default.compilerPath" : "${workspaceFolder}/../MinGW/bin/g++.exe",
    "workbench.iconTheme": "vscode-icons",
    "editor.fontSize": 16,
    "code-runner.ignoreSelection": true,
    "code-runner.saveFileBeforeRun": true,
    "code-runner.runInTerminal": true,
    "code-runner.preserveFocus": false,
    "files.exclude": {
        "**/.classpath": true,
        "**/.project": true,
        "**/.settings": true,
        "**/.factorypath": true
    },
    "C_Cpp.updateChannel": "Insiders",
    "C_Cpp.default.cppStandard": "c++11",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",
    "C_Cpp.default.cStandard": "c99"
}

使用绝对路径的好处就是:无论在哪创建工作区,都可以直接使用,没有工作区的限制,但是和vscode在这个地方目前的唯一限制是由MinGW的问题造成的,目前博主还没有找到好的方法。如果有大佬知道,可以交流一下~~

这个限制就是:VScode运行C++的文件必须在当前工作区的根目录下

对于includePath可以用 ${execPath} 来设置绝对路径,但是这个方法也有弊端,用绝对路径的话,如何路径上有一点变化就会出问题,之前的相对路径的好处就是能够移植,无论把Code文件夹移动到哪个位置,都是可以用的,所以各有好处

现在和本地vscode的在这个方面的唯一区别就只剩下一个了:就是MinGW的编译问题,因为MinGW的特殊性,所以编译C++文件只能是工作区的根目录

2+

发表评论

电子邮件地址不会被公开。 必填项已用*标注

14 − 10 =