VS Code下的C/C++开发

目录

0 工具准备

1 环境的搭建

2 工程源码的编写

3 CMakelists文件的编写

4 build工程

4.1 手动

4.2 优雅

5 debug & run

6 其他


0 工具准备

  • 编译工具合集: GCC

        GCC, the GNU Compiler Collection. 该组织(GNU)在Linux环境下提供一系列开源开发工具. Windows环境下并不提供, 但有各种移植版本, 本文使用MinGW-w64, 但该组织并不提供Binaries, 需要我们手动编译或者下载其它组织或个人提供的工具包. 本文使用上传于 SOURCEFORGE组织的8.1.0版本. 该工具包主要包含, C/C++和Fortran的开发工具合集, 工程管理(编译)工具make等.

        该工具最新版本的获取请访问发布者(据说和SF闹掰了)GitHub,或者Winlibs.

  • 工程管理工具: CMake

        为了生成不同工具下的项目管理文件(如makefile, sln)而设计, 为简化管理文件以及实现项目的跨平台, CMake这类工具应运而生. 就编译源代码来说CMake, make都不是必须的, 它们的存在只是为了更方便更快速的将C/C++工程源码编译为binaries.

        在VS Code里添加几个C/C++, CMake的插件: Better C++ Syntax, C/C++, C/C++ Themes, CMake Tools, CMake Language Support​.​​​​​​

1 环境的搭建

  • 将工具包解压或下载至本地

        若选择下载压缩包则需要将".\mingw810_64_posix\bin"(此处不同版本名称不一样)目录添加至系统变量path里面; 若选择用MinGW-W64-install.exe直接安装则不需要这一步.

        添加完成后进行测试:

PS \***\Point> gcc
gcc.exe: fatal error: no input files
compilation terminated.
PS \***\Point>

         如此便证明你将路径设置成功.

  • CMake解压或下载至本地

        方法同上一步, 最终都是让工具的bin文件夹出现在系统变量path里.

2 工程源码的编写

        首先新建一个文件夹并命名, 在该文件夹下编写源代码及各种其它文件. 本文C++工程用例结构如下:

PS \***\Point> tree
├─.vscode
├─bin
│  ├─Debug
│  └─Release
├─build
├─examples
├─include
├─lib
│  ├─Debug
│  └─Release
├─src
└ CMakeLists.txt
  • .vscode

        VS Code的配置文件夹, 内有json文件.

  • bin

        包含两个子文件夹debug和release, 子文件夹里包含主程序, 即由含有main()函数源代码生成的Binaries文件.

  • build

        编译产生的各种中间文件.

  • examples

        包含main()函数的源代码文件存放处.

  • include

        头文件源代码的存放处.

  • lib

        编译生成的库文件(Binaries形式)存放处.

  • src

        库文件源代码存放处.

3 CMakelists文件的编写

# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 3.0)

# 声明一个 cmake 工程
project(Point)
message(STATUS "Start building project!")

# 设置编译模式
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release")
endif()
message(STATUS "Build Type:${CMAKE_BUILD_TYPE}")

# 添加头文件
include_directories("./include/")

# 设置库文件路径生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/${CMAKE_BUILD_TYPE})

# 创建静态链接库
add_library(Point STATIC ./src/Point.cc)

# 创建动态链接库
add_library(PointShared SHARED ./src/Point.cc)
SET_TARGET_PROPERTIES(PointShared PROPERTIES OUTPUT_NAME "Point")

# 设置可执行文件路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE})

# 添加可执行程序调用Point库中函数
add_executable(Main ./examples/Main.cc)

# 将库文件链接到可执行程序上
target_link_libraries(Main PointShared)

# 添加可执行程序调用Point库中函数
add_executable(TestPoint ./examples/TestPoint.cc)

# 将库文件链接到可执行程序上
target_link_libraries(TestPoint PointShared)

#[[不难看出这个工程编译完成后有两个可执行程序、
一组库(静态、动态各编译出来了)文件
但可执行程序链接了动态库]]

        详细的使用说明请参考官方文档.

4 build工程

4.1 手动

        当前我们命令行的路径处在工程文件夹下, 输入指令:

PS \***\Point> cd build
PS \***\Point\build>

        build文件夹名称任意, 不过帅的人都用这个.

  • cmake

        将CMakelists.txt文件编译为Makefile文件:

PS \***\Point\build> cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /****/mingw810_64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /****/mingw810_64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Start building project!
-- Build Type:Debug
-- Configuring done
-- Generating done
-- Build files have been written to: /***/project/build
PS \***\Point\build>
  • make

        为了方便接下来的使用, 我们将mingw32-make.exe文件复制一份在GCC文件夹下并重命名为make.exe, 接下来我们使用make编译Makefile文件:

PS \***\Point\build> make
[ 12%] Building CXX object CMakeFiles/Point.dir/src/Point.cc.obj
[ 25%] Linking CXX static library ..\lib\Debug\libPoint.a
[ 25%] Built target Point
[ 37%] Building CXX object CMakeFiles/PointShared.dir/src/Point.cc.obj
[ 50%] Linking CXX shared library ..\lib\Debug\libPoint.dll
[ 50%] Built target PointShared
[ 62%] Building CXX object CMakeFiles/Main.dir/examples/Main.cc.obj
[ 75%] Linking CXX executable ..\bin\Debug\Main.exe
[ 75%] Built target Main
[ 87%] Building CXX object CMakeFiles/TestPoint.dir/examples/TestPoint.cc.obj
[100%] Linking CXX executable ..\bin\Debug\TestPoint.exe
[100%] Built target TestPoint
PS \***\Point\build>

        至此, 可执行文件生成成功.

4.2 优雅

       直接输入命令或许很酷但不够快捷, 此时我们可以使用VS Code里面的CMake Tools扩展工具, 点击红框处的编译button, 此时CMake Tools会自己向命令行写指令来完成编译(使用这步可以省略本节的cmake和make这两步骤).

​​

         也可以点击左下角红框里的“build”按钮

5 debug & run

  • 运行

          成功编译通过后, 我们可以进入bin文件夹下直接运行相应的可执行性程序或者click这个button如下图, 都可以运行. 

​​

         但你会发现出现“缺少***.dll”或不运行也不报错的问题. 是因为我们用到的的动态链接库(.dll/.so)与可执行文件不在同一文件夹内, 需要我们手动或自动复制过来, 或将路径添加到动态链接库的系统变量. 至此你应当运行成功.

  • 调试

        当我们编译通过但运行结果不好(像屎一样)时, 不可避免的进行调试.

        首先, 我们需要在.vscode文件夹下编写launch.json文件, 在该文件里配置好调试器, 此处同样使用GCC工具包里的gdb程序.

{
"version": "0.1.0",
"configurations": {
            "name": "gdb.exe - 调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\bin\\Debug\\Main.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "\\***\\mingw810_64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            // "preLaunchTask": "C/C++: g++.exe 生成活动文件"
        }
}

        需要注意的是倒数第三行, 即"preLaunchTask"键所在的行需要注释掉, 否则每次调试时, VS Code将自动执行tasks.json文件里的命令. 该文件通过使用的编译器和提供的参数(头文件路径、链接库路径、输出的可执行文件路径、编译模式、优化程度、是否打印问题等)将直接编译源代码, 但我们已经使用CMakelists.txt文件设置好各部分, 因此并不需要使用它.

        如果大家觉得配置起来有些麻烦, 可以直接使用gdb调试可执行文件, 只是没有图形界面.

        然后我们在源代码界面, 找一处你觉得可能出问题的地方打个断点, 并点击调试三角按钮, IDE将进入调试界面.

​​

       同样存在不需要建立launch文件的方式: 在待调试的源码上打上断点, 然后点击左下角的debug按钮VS Code自动给你安排明白.

        最后, 找到问题, 解决问题.

        当你发现某个问题无法解决时, 解决提出问题的人不失为一良策.

6 其他

  • 使用MSVC开发组件

        现在MSVC只能通过VS获取, 但却非要使用VS Code, 这何尝不是一种牛头人 

        可以在此处,添加“Build Tools for Visual Studio 20xx”

  • 关于runtime的选择

        本人建议使用UCRT,相较于MSVCR更新也是未来,与MSVC的兼容性也更好,但使用MSVCR的编译组件生成的第三方库无法与使用UCRT的编译组件通用,动态链接库会出现错误.

        也可以生成Ninja工程: cmake -G "Ninja". Ninja会自动使用gcc、g++这类工具,与make的使用方式基本一样. 据说该工具是google为了防止员工以程序正在编译的名头而摸鱼制造的,可以加快程序的编译速度.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值