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.zip
fichier téléchargé, trouvez le chemin où bin
se trouve le fichier décompressé
, puis ajoutez le chemin où se trouve le bac, comme je l'ai ici, D:\install\mingw64\bin
à la variable d'environnement système.
(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 -v
gcc --version
1.2 Configurer l'environnement C/C++
L'environnement C++ est configuré via et trois c_pp_propertoes.json
fichiers .launch.json
tasks.json
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/
-
Décompressez le package d'installation et cliquez
vscch.exe
pour suivre étape par étape ; l'installation est très simple, il suffit de suivre la méthode d'installation par défaut.
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.
-
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.json
ettasks.json
, et seront automatiquement générés sous le chemin de travail que vous choisissez .helloworld.cpp
Il peut s'exécuter et tester si l'environnement c++ est configuré avec succès :
注意:
selon la génération automatiquejson配置
, 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é. serasingle file build
changé enbuild
launch.json
La modification est la suivante :
tasks.json
La modification est la suivante :
Méthode 2 Créer 3 fichiers json directement
Créez un répertoire sur le répertoire du projet .vscode
et créez c_cpp_properties.json
, launch.json
, tasks.json
, trois fichiers json selon la configuration que j'ai fournie.
(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"
}
json
Remarque : Définissez le chemin dans ces 3 fichiers D:\\install\\mingw64
sur 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.json
et launch.json
est configurée à travers 4 tasks.json
fichiers .settings.json
c++环境
(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.json
La 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 projetTensorRT
,cuda
aucune 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 :
cd vers l'un d'entre eux tel que cuda, vous pouvez voir en détail ce que cuda contient.h文件
- 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, tasks
les label
noms 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ù estpro
le nom du fichier exécutable (makefile
généré spécifié dans可执行文件的名称
),-j6
ce 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.json
Dé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ùpro
le nom du fichier exécutable de sortie est spécifié dans le makefile.
"program": "${workspaceFolder}/workspace/pro",
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éfiniTrue
, 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éfiniefalse
surmiDebuggerPath
: 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_PATH
par la valeur de la variable d'environnementvalue
. LD_LIBRARY_PATH est principalement utilisé pour spécifier ce qui doit être ouvert外部库文件的搜索路径
.vlaue
Spécifiez le chemin de recherche des fichiers de bibliothèque dans , séparés par:
. Si le projet doit dépendre detensorrt
,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_PATH
terminer 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âchetasks.json
dans , 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