基于vscode的c++开发(Windows)

文章目录

  • 开发环境搭建
  • 项目文件夹
  • GCC编译器
    • 编译过程
    • g++的重要编译参数
  • CMake
    • 语法特性
    • 重要指令
    • CMake编译工程
  • 参考链接

开发环境搭建

安装VScode和GCC编译器。

项目文件夹

一般一个项目中应该包含
include文件夹——用于保存头文件
src文件夹——用于保存源文件

GCC编译器

GCC编译器支持编译go、c、c++等语言。vscode就是通过调用GCC编译器来实现c/c++的编译工作的。
在使用过程中,
使用gcc指令编译c代码;
使用g++指令编译c++代码。

编译过程

1.预处理
在此阶段编译器会处理以“#”开头的预处理指令,如#include、#define 等;
处理后的文件通常会将头文件的内容替换到 #include 指令所在的位置,并且会展开 #define 宏定义。

# -E 选项指示编译器仅对输入文件进行预处理
g++  -E  test.cpp  -o  test.i    //.i文件

2.编译
在这个阶段,预处理后的源代码被翻译成汇编代码

# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
#  g++ 产生的汇编语言文件的缺省扩展名是 .s 
g++  -S  test.i  -o   test.s

3.汇编
汇编器将汇编代码转换为二进制目标文件,汇编器将汇编代码转换为机器指令,并生成目标文件,目标文件中包含了机器指令、符号表、重定位信息和其他元数据。

# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++  -c  test.s  -o  test.o

4.链接
将所有的目标文件以及可能的库文件链接在一起形成最终的可执行文件。链接器将各个目标文件中的符号引用解析为实际的内存地址,并且将程序所需要的库文件链接到最终的可执行文件中。

# -o 编译选项来为将产生的可执行文件用指定输出路径与文件名
g++  test.o  -o  test

g++的重要编译参数

  1. -g 编译带调试信息的可执行文件
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件test
 g++ -g test.cpp
  1. -O[n] 优化源代码
    -O2 较常使用。
## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作
会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
# -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 
选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为03)
# -O 同时减小代码的长度和执行时间,其效果等价于-O1
 # -O0 表示不做优化
# -O1 为默认优化
# -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。
# -O3 则包括循环展开和其他一些与处理特性相关的优化工作。
# 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
# 使用 -O2优化源代码,并输出可执行文件
g++ -O2 test.cpp
  1. -l|-L 指定库文件|库文件路径
 # -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 LINUX系统下的
# 链接glog库
g++ -lglog test.cpp
 # 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名
# 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
  1. -I 指定头文件搜索目录
# -I 
# /usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude
里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上
I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错
误。-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参
数就是用来生成-I参数的。
g++ -I/myinclude test.cpp
  1. -Wall 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
  1. -std=c++11 设置编译编译标准
 # 使用 c++11 标准编译 test.cpp
 g++ -std=c++11 test.cpp
  1. -o 指定输出文件路径与文件名
# 指定即将产生的文件名
# 指定输出可执行文件名为test
 g++ test.cpp -o test

CMake

cmake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的编译过程。

语法特性

基本语法格式:指令(参数1 参数2……)
参数使用括号括起来;
参数之间使用空格或者分号分开;
指令是大小写无关的,参数和变量是大小写相关的

 set(HELLO hello.cpp)
 add_executable(hello main.cpp hello.cpp)
 ADD_EXECUTABLE(hello main.cpp ${HELLO})

变量使用 ${} 方式取值。

重要指令

cmake_minimum_required - 指定CMake的最低版本要求
语法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])

# CMake最小版本要求为2.8.3
 cmake_minimum_required(VERSION 2.8.3)

project - 定义工程名称,并可指定工程支持的语言
语法: : project(projectname [CXX] [C] [Java])

# 指定工程名为HELLOWORLD
 project(HELLOWORLD)

**set - 显式的定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

# 定义SRC变量,其值为sayhello.cpp hello.cpp
 set(SRC sayhello.cpp hello.cpp)

include_directories - 向工程添加多个特定的头文件搜索路径 —>相当于指定g++编译器的-I参数
语法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)

add_compile_options - 添加编译参数
语法:add_compile_options()

 # 添加编译参数 -Wall -std=c++11 -O2
 add_compile_options(-Wall -std=c++11 -O2)

link_directories - 向工程添加多个特定的库文件搜索路径 —>相当于指定g++编译器的-L参数
语法: link_directories(dir1 dir2 …)

# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)

add_library - 生成库文件
语法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 … sourceN)

# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})

add_executable - 生成可执行文件
语法:add_executable(exename source1 source2 … sourceN)

 # 编译main.cpp生成可执行文件main
 add_executable(main main.cpp)

target_link_libraries - 为 target 添加需要链接的共享库 —>相同于指定g++编译器-l参数
语法: target_link_libraries(target library1<debug | optimized> library2…)

# 将hello动态库文件链接到可执行文件main
 target_link_libraries(main hello)

aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
语法: aux_source_directory(dir VARIABLE)

 # 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
 # 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})

add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

# 添加src子目录,src中需有一个CMakeLists.txt
 add_subdirectory(src)

以下为一个CMakeLists.txt的基本模板

# 指定最低版本
cmake_minimum_required(VERSION 3.0)

# 设定工程名称
project(MYPROJECT)

# 设定编译参数
add_compile_options(-Wall -std=c++11 -g -O2)

# 设定所有源码列表,设定该指令可以简化add_execuable()指令的编写
aux_source_directory(./src SRC_DIR)

# 包含头文件路径 include_directories("路径1" "路径1" ……) → g++ -I./***
include_directories(./include)

# 设定链接库路径,一般用于链接第三方库 link_directories("路径1"  “路径2”...) → g++ -L./***
link_directories(../lib)

# 生成动态/静态链接库  add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
# add_library(动/静链接库名称 [STATIC/SHARED](可选参数默认为STATIC) source1 source2 source3……)
add_library()

# 生成可执行文件 add_executable(exename source1 source2 ... sourceN)
add_executable(mywsap main.cpp ${SRC_DIR})

# 为target添加需要链接的第三方库、共享库 → g++ -l target_link_libraries(target library1<debug | optimized> library2...)
target_link_libraries()

CMake编译工程

CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则:

  1. 在包含源文件的子文件夹中还包含CMakeLists.txt文件,主目录的CMakeLists.txt通过
    add_subdirectory(subdir1)
    add_subdirectory(subdir2)
    添加子目录即可
    这种编译规则适用于项目较大结构复杂的情况,当项目包含多个模块或者子系统,每个模块的编译规则较为复杂时,可以使用这种编译规则。这样可以将项目按模块分解,每个模块有自己独立的 CMakeLists.txt 文件,使得项目结构更加清晰。
  2. 在包含源文件的子文件夹中未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中;
    这种编译规则适用于项目结构相对简单,项目所包含的模块数量较少,直接在主目录的 CMakeLists.txt 文件中定义所有的编译规则,简化项目的管理与维护。

编译流程

  1. 在Windows系统下使用CMake构建C/C++工程的流程
    • 手动编写CMakeLists.txt文件,定义编译规则。
    • 执行命令cmake PATH 生成Makefile文件(PATH是主目录CMakeList.txt所在的目录。) 如果你的电脑安装了vs,那么此过程可能会调用微软的MSVC编译器,此时便需要使用cmake -G ”MinGw Makefiles" PATH 来指定编译器。
    • 执行 mingw32-make.exe 命令进行编译。
  2. 在Linux系统下使用CMakeLists.txt构建C/C++工程的流程
    • 手动编写CMakeLists.txt文件,定义编译规则。
    • 执行命令cmake PATH 生成Makefile文件(PATH是主目录CMakeList.txt所在的目录。)
    • 执行 make 命令 进行编译。

构建方式

  1. 内部构件
    内部构建会在同级目录下产生一大堆的中间文件,这些中间文件不是我们最终所需要的,和工程源文件放在一起会显得杂乱无章。不推荐使用
## 内部构建
# 在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
cmake .
 # 执行make命令,生成target
 mingw32-make.exe
  1. 外部构建
    将编译输出文件与源文件放到不同目录中
## 外部构建
# 1. 在当前目录下,创建build文件夹
mkdir build 
# 2. 进入到build文件夹
cd build
 # 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake [-G "MinGW Makefiles"] ..
 # 4. 执行make命令,生成target
 mingw32-make.exe

参考链接

添加链接描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考-系统分析师-精要2

5、可行性分类 经济可行性&#xff1a;成本收益分析&#xff0c;包括建设成本、运行成本和项目建设后可能的经济收益。 技术可行性&#xff1a;技术风险分析&#xff0c;现有的技术能否支持系统目标的实现&#xff0c;现有资源&#xff08;员工&#xff0c;技术积累&#xff0…

GEM TSU Interface Details and IEEE 1588 Support

摘要&#xff1a;Xilinx ZNYQ ULTRASCALE MPSOC的GEM和1588的使用 对于FPGA来说&#xff0c;只需要勾选一些znyq的配置就行了&#xff0c;其余的都是软件的工作&#xff1b; 所有配置都勾选之后&#xff0c;最终会露出来的接口如下&#xff1a; GEM需要勾选的配置如下&#xf…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集&#xff0c;非常适合刚入门的小伙伴进行学习&#xff01; 泰坦尼克号轮船的…

AI新闻速递:揭秘本周科技界最热的AI创新与发展

兄弟朋友们&#xff0c;本周的AI领域又迎来了一系列激动人心的进展。在这个快速变化的时代&#xff0c;不会利用AI的人&#xff0c;就像在数字化高速公路上步行的旅行者&#xff0c;眼看着同行者驾驶着智能汽车绝尘而去&#xff0c;而自己却束手无策。 1. Adobe Firefly 3&…

【基础算法总结】双指针算法二

双指针 1.有效三角形的个数2.和为S的两个数字3.和为S的两个数字4.四数之和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.有效三角形的个数…

深度学习运算:CUDA 编程简介

一、说明 如今&#xff0c;当我们谈论深度学习时&#xff0c;通常会将其实现与利用 GPU 来提高性能联系起来。GPU&#xff08;图形处理单元&#xff09;最初设计用于加速图像、2D 和 3D 图形的渲染。然而&#xff0c;由于它们能够执行许多并行操作&#xff0c;因此它们的实用性…

Python游戏工具包pygame

当你涉及游戏开发时&#xff0c;Pygame是一个强大的工具包&#xff0c;它提供了一系列功能丰富的模块和工具&#xff0c;让你可以轻松地创建各种类型的游戏。在本文中&#xff0c;我将介绍Pygame的依赖以及其详细属性&#xff0c;同时提供一些示例代码来说明其用法。 目录 一…

Github 2024-04-27 开源项目日报 Top9

根据Github Trendings的统计,今日(2024-04-27统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2C++项目1JavaScript项目1Open-Sora: 构建自己的视频生成模型 创建周期:17 天开发语言:Python协议类型:Apache Lic…

嵌入式Linux学习——Linux常用命令(上)

Linux命令行介绍 Linux Shell 简介 Shell 的意思是“外壳”&#xff0c;在 Linux 中它是一个程序&#xff0c;比如/bin/sh、/bin/bash 等。它负责接收用户的输入&#xff0c;根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时&#xff0c; shell 程序找到“ ls…

TinyML之Hello world----基于Arduino Nano 33 BLE Sense Rev2的呼吸灯

早期版本的Hello World 这应该是一个逼格比较高的呼吸灯了&#xff0c;用ML来实现呼吸灯功能&#xff0c;之前已经有大佬发过类似的文章&#xff1a;https://blog.csdn.net/weixin_45116099/article/details/126310816 当前版本的Hello World 这是一个ML的入门例程&#xff…

黑马程序员C++学习总结【进阶篇】

本阶段主要针对C泛型编程和STL技术做详细讲解&#xff0c;探讨C更深层的使用 黑马程序员C学习总结【基础篇】 黑马程序员C学习总结【核心篇】 黑马程序员C学习总结【进阶篇】 黑马程序员C学习总结【进阶篇】 一、模板1.函数模板&#xff08;1&#xff09;函数模板2种使用方式&a…

重学java 25.面向对象 权限修饰符、final关键字、代码块

别让平淡生活&#xff0c;耗尽你所有的向往 —— 24.4.27 重点概述 01.知道final修饰成员之后特点 02.会使用静态代码块以及知道静态代码块的使用场景 03.会使用匿名内部类 一、权限修饰符 1.概述 在Java中提供了四种访问权限&#xff0c;使用不同的访问权限修饰符修饰时&#…

为什么 Facebook 不使用 Git?

在编程的世界里&#xff0c;Git 就像水一样常见&#xff0c;以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工&#xff0c;2024 年 首先&#xff0c;我为什么关心&#xff1f; 我致力于构建 Graphite&#xff0c;它从根本上受到 Facebook 内部工具的…

第十五届蓝桥杯省赛第二场C/C++B组E题【遗迹】题解

解题思路 错解 贪心&#xff1a;每次都移动至当前最近的对应方块上。 反例&#xff1a; s s s abxac t t t abac 贪心结果&#xff08;下标&#xff09; 0 → 1 → 0 → 4 0 \rightarrow 1 \rightarrow 0 \rightarrow 4 0→1→0→4&#xff0c;答案为 5 5 5。 正确结…

【MRI重建】基于径向采样的GRASP重建实现(matlab)

关于 对比增强MRI和弥散MRI成像,对于时间分辨率要求都比较高,为了捕获高时间空间分辨率,这里使用GRASP方法,重建radial径向采样的MR数据。使用的稀疏正则项为 temporal total variation。 相关文章 https://onlinelibrary.wiley.com/doi/10.1002/mrm.24980 https://onl…

前端学习笔记3

列表、表格与表单​ 列表就是信息资源的一种展示形式。它可以使信息结构化和条理化,并以列表的样式显示出来,以便浏览者能更快捷地获得相应的信息。 3.0 代码访问地址 https://gitee.com/qiangge95243611/java118/tree/master/web/day03 3.1 列表 ​ 列表大致可以分为3类…

mac资源库的东西可以删除吗?提升Mac运行速度秘籍 Mac实用软件

很多小伙伴在使用mac电脑处理工作的时候&#xff0c;就会很疑惑&#xff0c;电脑的运行速度怎么越来越慢&#xff0c;就想着通过删除mac资源库的东西&#xff0c;那么mac资源库的东西可以删除吗&#xff1f;删除了会不会造成电脑故障呢&#xff1f; 首先&#xff0c;mac资源库…

沉浸式推理乐趣:体验线上剧本杀小程序的魅力

在这个信息爆炸的时代&#xff0c;人们的娱乐方式也在不断地推陈出新。其中&#xff0c;线上剧本杀小程序以其独特的沉浸式推理乐趣&#xff0c;成为了许多人的新宠。它不仅让我们在闲暇之余享受到了推理的快乐&#xff0c;更让我们在虚拟的世界里感受到了人性的复杂与多彩。 线…

【hackmyvm】 Quick2靶机

渗透流程 渗透开始1.IP地址 获取2.端口扫描3.任意文件读取4.扫描目录5.总结信息6.漏洞扫描7.php_filter_chain_generator.py使用8.提权 渗透开始 1.IP地址 获取 ┌─[✗]─[userparrot]─[~] └──╼ $fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.124 本机 192.1…

base64格式图片直接显示

<img :src"data:image/png;base64,url"/>
最新文章