前言:网上好多同学发的都是单目录(一个文件夹下),多个cpp文件的联合编译。对于多文件夹,多目录,多个CPP文件的编译可查询的资料查起来不是很容易。
现在来总结一下:
一、单文件夹(即单目录)下的多.cpp使用code runner 运行代码的方式。
其他博文有介绍,基本是一个main.cpp hello world.cpp在一个文件夹下的介绍。
说明:单文件夹下的多个cpp的联合编译网上很多都是使用code runner 插件中的settings.json,修改g++ 后的参数为:*.cpp。code runner插件视乎只能完成到这这步,多目录,多文件夹的联合运行代码我尝试了始终不行。其实该插件只是为了方便不同代码的执行,一般而言我们主要都是使用一种语言如c++、或者Python,该插件在命令层面应该是和tasks.json文件中的 -g,-o 命令重复的,主要作用起到了一个命令覆盖的作用。也可以完全不使用该插件。
{
"files.associations": {
"charconv": "cpp",
"*.tcc": "cpp",
"iostream": "cpp"
},
//自动清除终端
"code-runner.clearPreviousOutput": true,
"code-runner.runInTerminal": true,
"code-runner.saveFileBeforeRun": true,
"code-runner.showExecutionMessage": false,
//每次清除Debug模式下(F5)的终端输出
"debug.terminal.clearBeforeReusing": true,
"code-runner.executorMap": {
//"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",$dirWithoutTrailingSlash
"cpp": "clear && cd $dir && g++ *.cpp && -o $fileNameWithoutExt && $dir$fileNameWithoutExt",//这种只适合所有的Cpp在同一个目录下
"python": "python -u",
//文件名及其目录等参数详解:
//:$fileName 当前不带目录的文件名,如 main.cpp 文件界面点击运行,$fileName = main.cpp
//: $fullFileName: The full name of the code file being run 这个效果和 参数 $filename 是一样的
//: $fileNameWithoutExt: The base name of the code file being run without its extension,不带扩展名的文件名
//: $dirWithoutTrailingSlash: 当前带目录的文件名,但目录路径没有斜杠
}
}
二、多文件夹,多目录、多cpp文件的联合编译
前面说到,使用code runner 暂时不知多文件夹下的联合编译,所以这里采取将code runner 插件禁用,直接使用tasks.json 、lanunch,json 和c_cpp_properties.json进行配置。
项目文件结构如下:工作区:CODE;在子文件夹中建立了子项目:MyCFD_1101,该项目下又存在三个子文件夹,分别存放cpp\h代码。
macin.cpp文件界面开始运行
tssks.json文件:修改 -g 后的参数命令,将所有要编译的cpp文件包含进去;修改 -I 后的参数命令将项目需要引用的头文件包含进去(不包含也能正常运行)。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
//任务名
"label": "MyCFD",
"command": "D:/APP/mingw64/bin/g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",//生成和调试有挂信息
"-Wall",
//"${file}",
//"${fileDirname}\\*.cpp",//代表编译当前目录下的所有.cpp文件,大型项目,不同的cpp在不同目录下,run code 模式运行就会出现:undefined referecde to 'xxx函数'
"${workspaceFolder}\\code_test\\MyCFD_1101\\*.cpp ",
"${workspaceFolder}\\code_test\\MyCFD_1101\\readcase\\*.cpp",
"${workspaceFolder}\\code_test\\MyCFD_1101\\setequation\\*.cpp",
"${workspaceFolder}\\code_test\\MyCFD_1101\\solver\\run_steady_calculation\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",//exe文件存放地址
//"${workspaceFolder}\\code_test\\MyCFD_1101\\${fileBasenameNoExtension}.exe",
//"-fexec-charset=GBK"//该设置与vscode自带编码冲突,导致中文乱码
],
"options": {
"cwd": "D:/APP/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"echo": false,//是否显示任务命令在终端,但似乎不作用
"reveal": "silent",
"focus": true,
"panel": "shared",//每次代开一个新的C/C++:g++.exe build active file 窗口
"showReuseMessage": false,//不输出:终端将被任务重用,安任意键关闭
"clear": true
},
"detail": "compiler: D:/APP/mingw64/bin/g++.exe"
}
]
}
c_cpp_properties.json 文件配置中添加h文件路径:
{
"configurations": [
{
"name": "mingw64",
"includePath": [
//添加头文件路径
"${workspaceFolder}/**",
"${workspaceFolder}\\code_test\\MyCFD_1101\\readcase\\",
"${workspaceFolder}\\code_test\\MyCFD_1101\\setequation",
"${workspaceFolder}\\code_test\\MyCFD_1101\\solver\\run_steady_calculation"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/APP/mingw64/bin/g++.exe",
"cStandard": "c17",
"cppStandard": "c++17",//是c++17,不是c17
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
launch.json文件:
{
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"preLaunchTask": "MyCFD", //任务名,任意取
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe", //设置生成的main.exe文件放在哪,位置任意放,不影响编译
"internalConsoleOptions": "openOnFirstSessionStart",
"args": [],
"stopAtEntry": false,
//"cwd": "${fileDirname}",//当前的打开的文件,你从main.cpp文件界面开始运行,那就是main.cpp
"cwd": "${workspaceFolder}",//当前打开的文件的工作目录, 我们需要针对整个工作区
"environment": [],
"externalConsole": false, //使用vscode控制台输出
"MIMode": "gdb",
"miDebuggerPath": "D:/APP/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true,
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
结果:
-----------------------------------解下来介绍在vscod 上使用Cmake进行编译构建项目-------------------------
首先我们从最简单的Cmake开始,并包含可能出现的错误的解决方案
一、在命令面板中选择Cmake的编译工具包,就是我们自己下载安装的ming64
生成了CMakeLists.txt、main.cpp和build文件夹以及其中的makefiles等文件。
上面几步关于可能出现错误:
错误1:vscode is not a full path to an existing compiler tool.
原因:编译器选择错误,仔细核对一下路径,并重新选择正确的。
错误2:CMake Error: Could not create named generator Mingw makefies
解决办法:将参数:"cmake.generator": "Mingw makefies",注释掉,
或者:
错误3:一致卡在:[main] 正在配置项目: code 这里
查看生成的demo.exe
------------------------------------上面是是初步使用Cmake、Cmaketool来快速熟悉使用--------------------
现在我们使用CmakeLists.txt来编译调试最开始的子项目:MyCFD_1101。注意这里为方便,项目名称,以及输出的exe文件名,和json文件中的任务名都统一为了main。
再重新修改tasks,json文件:修改command 命令参数为 cmake ,并去除重复的cpp文件
c_cpp_properties.json:去除重复引入的头文件
launch.json文件:修改program参数,确定调试时exe文件的所在目录
编译项目,生成exe文件:,如果遇到:undefined reference to xxx 报错,那肯定是CmakeLists.txt中没有包含cpp或者h文件。记住是将所有的.h和.cpp文件包含进去,包括主文件main.cpp。
下面开始运行、调试代码:
到此为止,我们从最开始的单纯使用vscode 的 json文件进行不同目录下的联合编译调试,再使用Cmake插件来正确生成build文件夹以及CMakeList.txt文件快速入门,并结合自己的项目文件,编写自己的CMakeList.txt,同时再重新配合json文件实现了项目运行和调试。
---------------------------------------更进一步:纯命令cmake\make编译项目-----------------------------
两步走:
第一步:
1. 配置正确的CMakeLists.txt(配置好后会自动生成build文件夹),并使用一下命令之一来生成makefiles文件
命令:cmake -G "Unix Makefiles" ..
命令:cmake -G "MinGW Makefiles" ..
第二步:使用命令: make 来生成main.exe可执行文件(而不是用vscode下方的生成按钮)
以上两种命令都可以生成build文件夹下的CmakeFiles等系列文件
命令: cmake -G "Unix Makefiles" .. 出现错误解决方法:
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
解决方案:将安装的mingw32-make.exe 复制一份 重命名为 make.exe
相关错误:Unix Makefiles 与 MinGW Makefiles 冲突。
解决方案:在settings.json中设定 "cmake.generator": "Unix Makefiles",
在window下,vscode 未定义cmake 生成器时,在修改CMakeLists.txt时,终端会自动进行编译,但默认选择的是 MinGW Makefiles 模式,编译器也会调用MSVC。这事可能就会前后产生冲突。,错误如下。
在设定生成器之后,如下:
文章来源:https://www.toymoban.com/news/detail-791640.html
文章来源地址https://www.toymoban.com/news/detail-791640.html
到了这里,关于vscode Cmake 多目录,多文件夹,多文件联合编译配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!