configuration de l'environnement vscode c++ (version ultime)

1. Configuration de l'environnement C++ du système Windows

1.1 Configurer le compilateur MinGw

(1) Télécharger mingw64

Selon le package de mingw64, je l'ai mis sur le disque réseau Baidu, et vous pouvez le télécharger vous-même :

Lien : https://pan.baidu.com/s/1NoPGAYFuP5ysXTf8wtvbEA?pwd=wd6w Code d'extraction : wd6w

(2) Configurer les variables d'environnement
Décompressez le mingw64.zipfichier téléchargé, trouvez le chemin où binse trouve le fichier décompressé
insérez la description de l'image ici
, puis ajoutez le chemin où se trouve le bac, comme je l'ai ici, D:\install\mingw64\binà la variable d'environnement système.
insérez la description de l'image ici
(3) Vérifiez si l'installation est réussie Entrez ou
dans la fenêtre cmd de l'invite de commande , si le numéro de version est affiché, l'installation est réussiegcc -vgcc --version

insérez la description de l'image ici

1.2 Configurer l'environnement C/C++

L'environnement C++ est configuré via et trois c_pp_propertoes.jsonfichiers .launch.jsontasks.json
insérez la description de l'image ici

Méthode 1 Utiliser des outils pour configurer automatiquement

Cet article présente une méthode de configuration d'environnement très simple, qui vscode c++配置器peut être réalisée à l'aide de celles fournies sur Internet.

  • Téléchargez le package d'installation sur https://v4.vscch.tk/
    insérez la description de l'image ici

  • Décompressez le package d'installation et cliquez vscch.exepour suivre étape par étape ; l'installation est très simple, il suffit de suivre la méthode d'installation par défaut.
    insérez la description de l'image ici
    Cet outil peut identifier automatiquement l'emplacement d'installation du compilateur MinGW. S'il n'est pas ajouté à la variable d'environnement, il aidera automatiquement à le configurer dans la variable d'environnement.
    insérez la description de l'image ici

  • Si MinGW n'est pas téléchargé, il vous invitera à le télécharger, puis vous aidera à configurer automatiquement les variables d'environnement.

  • Une fois l'installation terminée, les codes de test configurés c_pp_propertoes.json, launch.jsonet tasks.json, et seront automatiquement générés sous le chemin de travail que vous choisissez . helloworld.cppIl peut s'exécuter et tester si l'environnement c++ est configuré avec succès :
    insérez la description de l'image ici
    注意:selon la génération automatique json配置, il est uniquement valide d'écrire du code c++ lors de l'installation 指定的工作目录下, donc ce qui suit est fait, 修改afin que les 3 json puissent être copiés dans d'autres répertoires, et le Le programme c++ peut également être exécuté et débogué. sera single file buildchangé enbuild

launch.jsonLa modification est la suivante :
insérez la description de l'image ici
tasks.jsonLa modification est la suivante :
insérez la description de l'image ici

Méthode 2 Créer 3 fichiers json directement

Créez un répertoire sur le répertoire du projet .vscodeet créez c_cpp_properties.json, launch.json, tasks.json, trois fichiers json selon la configuration que j'ai fournie.
insérez la description de l'image ici
(1)c_cpp_properties.json

{
    
    
  "configurations": [
    {
    
    
      "compilerPath": "D:\\install\\mingw64\\bin\\g++.exe",
      "cppStandard": "c++17",
      "includePath": [
        "${
    
    {workspaceFolder}}/**"
      ],
      "intelliSenseMode": "windows-gcc-x64",
      "name": "Win32"
    }
  ],
  "version": 4
}

(2)launch.json

{
    
    
  "configurations": [
    {
    
    
      "MIMode": "gdb",
      "args": [],
      "cwd": "${fileDirname}",
      "env": {
    
    
        "PATH": "D:\\install\\mingw64\\bin;${env:PATH}"
      },
      "environment": [],
      "externalConsole": true,
      "internalConsosleOptions": "neverOpen",
      "miDebuggerPath": "D:\\install\\mingw64\\bin\\gdb.exe",
      "name": "build",
      "preLaunchTask": "build",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "request": "launch",
      "stopAtEntry": false,
      "type": "cppdbg"
    }
  ],
  "version": "0.2.0"
}

(3)tasks.json

{
    
    
  "options": {
    
    
    "env": {
    
    
      "Path": "D:\\install\\mingw64\\bin;${env:Path}"
    }
  },
  "tasks": [
    {
    
    
      "args": [
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe",
        "-std=c++17"
      ],
      "command": "D:\\install\\mingw64\\bin\\g++.exe",
      "group": {
    
    
        "isDefault": true,
        "kind": "build"
      },
      "label": "build",
      "presentation": {
    
    
        "clear": true,
        "echo": false,
        "focus": false,
        "panel": "shared",
        "reveal": "silent",
        "showReuseMessage": false
      },
      "problemMatcher": "$gcc",
      "type": "process"
    },
    {
    
    
      "args": [],
      "command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "dependsOn": "single file build",
      "label": "run and pause",
      "options": {
    
    
        "env": {
    
    
          "Path": "D:\\install\\mingw64\\bin;${env:Path}"
        }
      },
      "presentation": {
    
    
        "clear": true,
        "echo": false,
        "focus": false,
        "panel": "shared",
        "reveal": "never",
        "showReuseMessage": false
      },
      "problemMatcher": [],
      "type": "pause-console"
    }
  ],
  "version": "2.0.0"
}

jsonRemarque : Définissez le chemin dans ces 3 fichiers D:\\install\\mingw64sur votre propre chemin

1.3 Test d'environnement C/C++

Ecrire un test helloworld.cpp, le code est le suivant :


// 按下 F6 编译运行。
// 按下 F5 编译调试。
// 按下 Ctrl + Shift + B 编译。

#include <iostream>

int main() {
    
    
    // 在标准输出中打印 "Hello, world!"
    std::cout << "Hello, world!" << std::endl;
}

// 此文件编译运行将输出 "Hello, world!"。
// 按下 F6 后,你将在弹出的终端窗口中看到这一行字。

Voir la configuration et le code que j'ai téléchargé sur Baidu Netdisk :
Lien : https://pan.baidu.com/s/13R79Wxn91Z4G7RCcXpr8fQ?pwd=xe2x
Code d'extraction : xe2x

Référence : https://zhuanlan.zhihu.com/p/545908287?utm_id=0

2. Configuration de l'environnement C++ du système Linux

2.1 Détails de la configuration

La configuration du système linux vsocde est fondamentalement la même que celle du système de fenêtre, c_pp_propertoes.jsonet launch.jsonest configurée à travers 4 tasks.jsonfichiers .settings.jsonc++环境

(1)settings.json

{
    
    
    "files.associations": {
    
    
        "*.cpp": "cpp",
        "*.cu": "cuda-cpp",
        "deque": "cpp",
        "string": "cpp",
        "vector": "cpp",
        "*.tcc": "cpp",
        "__hash_table": "cpp",
        "__split_buffer": "cpp",
        "__tree": "cpp",
        "array": "cpp",
        "bitset": "cpp",
        "initializer_list": "cpp",
        "iterator": "cpp",
        "map": "cpp",
        "queue": "cpp",
        "random": "cpp",
        "set": "cpp",
        "stack": "cpp",
        "string_view": "cpp",
        "unordered_map": "cpp",
        "utility": "cpp",
        "__atomic": "cpp",
        "__functional_base": "cpp",
        "__functional_base_03": "cpp",
        "__tuple": "cpp",
        "algorithm": "cpp",
        "chrono": "cpp",
        "type_traits": "cpp",
        "filesystem": "cpp",
        "functional": "cpp",
        "limits": "cpp",
        "memory": "cpp",
        "ratio": "cpp",
        "tuple": "cpp",
        "istream": "cpp",
        "ostream": "cpp",
        "future": "cpp",
        "cctype": "cpp",
        "clocale": "cpp",
        "cmath": "cpp",
        "cstdarg": "cpp",
        "cstddef": "cpp",
        "cstdio": "cpp",
        "cstdlib": "cpp",
        "cstring": "cpp",
        "ctime": "cpp",
        "cwchar": "cpp",
        "cwctype": "cpp",
        "atomic": "cpp",
        "hash_map": "cpp",
        "hash_set": "cpp",
        "bit": "cpp",
        "codecvt": "cpp",
        "complex": "cpp",
        "condition_variable": "cpp",
        "cstdint": "cpp",
        "list": "cpp",
        "unordered_set": "cpp",
        "exception": "cpp",
        "memory_resource": "cpp",
        "numeric": "cpp",
        "optional": "cpp",
        "system_error": "cpp",
        "fstream": "cpp",
        "iomanip": "cpp",
        "iosfwd": "cpp",
        "iostream": "cpp",
        "mutex": "cpp",
        "new": "cpp",
        "sstream": "cpp",
        "stdexcept": "cpp",
        "streambuf": "cpp",
        "thread": "cpp",
        "cfenv": "cpp",
        "cinttypes": "cpp",
        "typeindex": "cpp",
        "typeinfo": "cpp",
        "ios": "cpp",
        "__nullptr": "cpp",
        "__bit_reference": "cpp",
        "__node_handle": "cpp",
        "__locale": "cpp",
        "variant": "cpp"
    }
}

settings.jsonLa configuration fournie ci-dessus peut être utilisée sans modification.

(2)c_cpp_propertoes.json
c_cpp_propertoes.json: Configurez les options pour la compilation c++, y compris les chemins du compilateur, les annotations C/C++ et spécifiez les chemins de recherche pour les fichiers d'en-tête (tels que opencv, etc.)

{
    
    
    "configurations": [
        {
    
    
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/include/**",
                "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages/opencv4.2/include/**"
            ],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "gnu++11",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

Configurer includePath

"includePath": [
                "${workspaceFolder}/**",
                "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/include/**",
                "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages/opencv4.2/include/**"
            ],

includePath: définit le chemin de recherche du fichier d'en-tête, afin que le compilateur puisse trouver le fichier d'en-tête correspondant.

  • Le premier élément : "${workspaceFolder}/**"ajoutez le chemin de travail du projet comme chemin de recherche du fichier d'en-tête, cet élément est ajouté par défaut
  • Le deuxième élément : lors de la configuration du déploiement de TensorRT, vous devez vous y fier 头文件, y compris les fichiers d'en-tête sous tensorrt lui-même, cuda, cudnn et protobuf. (S'il n'y a pas de dépendance dans le projet TensorRT, cudaaucune configuration n'est requise)
ls  /home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/include/

Vous pouvez voir certains fichiers d'en-tête dépendants :
insérez la description de l'image ici
cd vers l'un d'entre eux tel que cuda, vous pouvez voir en détail ce que cuda contient.h文件
insérez la description de l'image ici

  • Le troisième élément : configurez les fichiers d'en-tête opencv dépendants. (Si le projet ne dépend pas d'opencv, aucune configuration n'est requise)

Configurer le chemin du compilateur gcc

 "compilerPath": "/usr/bin/gcc"   # 设置gcc编译器即可,不需要设置g++

Grâce à ls /usr/bin, vous pouvez voir gcc, g++que les compilateurs sont tous dans ce répertoire

Spécifie la version d'annotation du langage C/C++

"cStandard": "gnu11",
"cppStandard": "gnu++11",

IntelliSense

"intelliSenseMode": "linux-gcc-x64"

(3)tasks.json
tasks.json : 指定 编译时需要执行cmake命令, et à chaque launch(debug)fois, il sera exécuté en premier tasks(ici, il sera compilé une fois).

Par conséquent, tasksles labelnoms suivants doivent être définis de la même manière que les paramètreslaunch.json dans , par exemple, les deux ."preLaunchTask"build

{
    
    
    "version": "2.0.0",
    "tasks": [
        {
    
    
            "label": "build",
            "type": "shell",
            "command": "make pro -j6"
        }
    ]
}
  • command: Exécutez la commande cmake, où est prole nom du fichier exécutable ( makefilegénéré spécifié dans 可执行文件的名称), -j6ce qui signifie que 6 processus sont exécutés en même temps. Si vous souhaitez compiler plus rapidement, vous pouvez définir un nombre plus grand.

(4)launch.json

{
    
    
    "version": "0.2.0",
    "configurations": [
        {
    
    
            "name": "program-debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/workspace/pro",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/workspace",
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "environment": [
                {
    
    
                    "name": "LD_LIBRARY_PATH", 
                    "value": "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/lib64:/home/yuanwushui/anaconda3/lib:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/py39:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages/opencv4.2/lib:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/lib:$LD_LIBRARY_PATH"
                }
            ],
            "setupCommands": [
                {
    
    
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build"
        }
    ]
}

launch.jsonDéfinissez les options pour le débogage c++. "configurations"Les paramètres de configuration suivants sont décrits ci-dessous :

  • program: Spécifiez le chemin du fichier exécutable compilé pro, où prole nom du fichier exécutable de sortie est spécifié dans le makefile.
    "program": "${workspaceFolder}/workspace/pro",

【image】

  • cwd: le répertoire où se trouve le fichier exécutable
  • "externalConsole": Lors de l'exécution, s'il faut exécuter sur une console externe. S'il est défini True, il s'exécutera dans la console CMD (Windows), s'il est défini sur false, il s'exécutera dans la console où se trouve le compilateur. La valeur par défaut est définie falsesur
  • miDebuggerPath: Spécifiez le chemin du débogueur (gdb)
  • environment: configurez les variables d'environnement. Le nom de la variable d'environnement est spécifié LD_LIBRARY_PATHpar la valeur de la variable d'environnement value. LD_LIBRARY_PATH est principalement utilisé pour spécifier ce qui doit être ouvert 外部库文件的搜索路径. vlaueSpécifiez le chemin de recherche des fichiers de bibliothèque dans , séparés par :. Si le projet doit dépendre de tensorrt, cuda, anaconda, opencv, vous devez ajouter ces fichiers de bibliothèque dépendants. Notez que la valeur doit :être séparée par les chemins de recherche des différentes bibliothèques et doit finalement se :$LD_LIBRARY_PATHterminer par .
 "environment": [
	 {
    
    
	       "name": "LD_LIBRARY_PATH", 
	       "value": "/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/lib64:/home/yuanwushui/anaconda3/lib:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8/py39:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages/opencv4.2/lib:/home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/lib:$LD_LIBRARY_PATH"
	   }
	],
  • setupCommands: Définissez les options d'impression, telles que l'embellissement de la sortie d'impression, conservez simplement la valeur par défaut, pas besoin de modifier
 "setupCommands": [
         {
    
    
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
            }
        ],
  • preLaunchTask: Nécessaire avant Launch (debug) 依赖的task任务, 注意il doit être identique au nom du paramètre de tâche tasks.jsondans , par exemple, les deux sont build . En définissant cette option, il n'est pas nécessaire de compiler manuellement le fichier exécutable pendant le débogage, et le système aidera automatiquement à le compiler.label不然无法调试和编译preLaunchTask
     "preLaunchTask": "build"

2.2 Explication détaillée du makefile

cc        := g++
name      := pro
workdir   := workspace
srcdir    := src
objdir    := objs
stdcpp    := c++11
cuda_home := /home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/trt8cuda112cudnn8
syslib    := /home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/lib
cpp_pkg   := /home/yuanwushui/anaconda3/lib/python3.9/site-packages/trtpy/cpp-packages  #opencv4.2
cuda_arch := 
nvcc      := $(cuda_home)/bin/nvcc -ccbin=$(cc)

# 定义cpp的路径查找和依赖项mk文件
cpp_srcs := $(shell find $(srcdir) -name "*.cpp")
cpp_objs := $(cpp_srcs:.cpp=.cpp.o)
cpp_objs := $(cpp_objs:$(srcdir)/%=$(objdir)/%)
cpp_mk   := $(cpp_objs:.cpp.o=.cpp.mk)

# 定义cu文件的路径查找和依赖项mk文件
cu_srcs := $(shell find $(srcdir) -name "*.cu")
cu_objs := $(cu_srcs:.cu=.cu.o)
cu_objs := $(cu_objs:$(srcdir)/%=$(objdir)/%)
cu_mk   := $(cu_objs:.cu.o=.cu.mk)

# 定义opencv和cuda需要用到的库文件
link_cuda      := cudart cudnn
link_trtpro    := 
link_tensorRT  := nvinfer nvinfer_plugin
link_opencv    := opencv_core opencv_imgproc opencv_imgcodecs
link_sys       := stdc++ dl protobuf
link_librarys  := $(link_cuda) $(link_tensorRT) $(link_sys) $(link_opencv)

# 定义头文件路径,请注意斜杠后边不能有空格
# 只需要写路径,不需要写-I
include_paths := src              \
    $(cuda_home)/include/cuda     \
	$(cuda_home)/include/tensorRT \
	$(cpp_pkg)/opencv4.2/include  \
	$(cuda_home)/include/protobuf

# 定义库文件路径,只需要写路径,不需要写-L
library_paths := $(cuda_home)/lib64 $(syslib) $(cpp_pkg)/opencv4.2/lib

# 把library path给拼接为一个字符串,例如a b c => a:b:c
# 然后使得LD_LIBRARY_PATH=a:b:c
empty := 
library_path_export := $(subst $(empty) $(empty),:,$(library_paths))

# 把库路径和头文件路径拼接起来成一个,批量自动加-I、-L、-l
run_paths     := $(foreach item,$(library_paths),-Wl,-rpath=$(item))
include_paths := $(foreach item,$(include_paths),-I$(item))
library_paths := $(foreach item,$(library_paths),-L$(item))
link_librarys := $(foreach item,$(link_librarys),-l$(item))

# 如果是其他显卡,请修改-gencode=arch=compute_75,code=sm_75为对应显卡的能力
# 显卡对应的号码参考这里:https://developer.nvidia.com/zh-cn/cuda-gpus#compute
# 如果是 jetson nano,提示找不到-m64指令,请删掉 -m64选项。不影响结果
cpp_compile_flags := -std=$(stdcpp) -w -g -O0 -m64 -fPIC -fopenmp -pthread
cu_compile_flags  := -std=$(stdcpp) -w -g -O0 -m64 $(cuda_arch) -Xcompiler "$(cpp_compile_flags)"
link_flags        := -pthread -fopenmp -Wl,-rpath='$$ORIGIN'

cpp_compile_flags += $(include_paths)
cu_compile_flags  += $(include_paths)
link_flags        += $(library_paths) $(link_librarys) $(run_paths)

# 如果头文件修改了,这里的指令可以让他自动编译依赖的cpp或者cu文件
ifneq ($(MAKECMDGOALS), clean)
-include $(cpp_mk) $(cu_mk)
endif

$(name)   : $(workdir)/$(name)

all       : $(name)
run       : $(name)
	@cd $(workdir) && ./$(name) $(run_args)

$(workdir)/$(name) : $(cpp_objs) $(cu_objs)
	@echo Link $@
	@mkdir -p $(dir $@)
	@$(cc) $^ -o $@ $(link_flags)

$(objdir)/%.cpp.o : $(srcdir)/%.cpp
	@echo Compile CXX $<
	@mkdir -p $(dir $@)
	@$(cc) -c $< -o $@ $(cpp_compile_flags)

$(objdir)/%.cu.o : $(srcdir)/%.cu
	@echo Compile CUDA $<
	@mkdir -p $(dir $@)
	@$(nvcc) -c $< -o $@ $(cu_compile_flags)

# 编译cpp依赖项,生成mk文件
$(objdir)/%.cpp.mk : $(srcdir)/%.cpp
	@echo Compile depends C++ $<
	@mkdir -p $(dir $@)
	@$(cc) -M $< -MF $@ -MT $(@:.cpp.mk=.cpp.o) $(cpp_compile_flags)
    
# 编译cu文件的依赖项,生成cumk文件
$(objdir)/%.cu.mk : $(srcdir)/%.cu
	@echo Compile depends CUDA $<
	@mkdir -p $(dir $@)
	@$(nvcc) -M $< -MF $@ -MT $(@:.cu.mk=.cu.o) $(cu_compile_flags)

# 定义清理指令
clean :
	@rm -rf $(objdir) $(workdir)/$(name) $(workdir)/*.trtmodel $(workdir)/*.onnx 
	@rm -rf $(workdir)/image-draw.jpg $(workdir)/input-image.jpg $(workdir)/pytorch.jpg

# 防止符号被当做文件
.PHONY : clean run $(name)

# 导出依赖库路径,使得能够运行起来
export LD_LIBRARY_PATH:=$(library_path_export)

2.3 Description du cas

à suivre

Je suppose que tu aimes

Origine blog.csdn.net/weixin_38346042/article/details/130658125
conseillé
Classement