基于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使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件testg++ -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.cppg++ -std=c++11 test.cpp
  1. -o 指定输出文件路径与文件名
# 指定即将产生的文件名
# 指定输出可执行文件名为testg++ 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.3cmake_minimum_required(VERSION 2.8.3)

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

# 指定工程名为HELLOWORLDproject(HELLOWORLD)

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

# 定义SRC变量,其值为sayhello.cpp hello.cppset(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 -O2add_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生成可执行文件mainadd_executable(main main.cpp)

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

# 将hello动态库文件链接到可执行文件maintarget_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.txtadd_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 ”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命令,生成targetmingw32-make.exe
  1. 外部构建
    将编译输出文件与源文件放到不同目录中
## 外部构建
# 1. 在当前目录下,创建build文件夹
mkdir build 
# 2. 进入到build文件夹
cd build# 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ["MinGw Makefiles"]..# 4. 执行make命令,生成targetmingw32-make.exe

参考链接

添加链接描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024第十三届深圳国际营养与健康产业博览会

医疗展、健康展、养生展、医药展、中医展、艾灸展、营养展、保健展、康复展、医美展、养老展、婴童展、医美展、护理展、理疗展、智能中医、医疗器械、氢氧、营养保健、大健康、医药制药、养老康复、食药同源 2024第十三届深圳国际营养与健康产业博览会 THE 13TH SHENZHEN IN…

全新Storm Core API管理系统源码 免授权版

全新Storm Core API管理系统源码 免授权版 本系统为API系统,实现了api集成等基础功能,以后可能会更新key调用api,或者实现付费功能,敬请期待,前端模板均无加密,用户可自行二开,具体请看图 测试环境:PHP7.2+MySQL5.6 访问:http://你的域名/install 进行安装 伪静态…

树 —— 树和森林的遍历

一、树的遍历 &#xff08;1&#xff09;先根遍历 若树非空&#xff0c;则遍历方法为 &#xff08;1&#xff09;访问根结点。 &#xff08;2&#xff09;从左到右&#xff0c;依次先根遍历根结点的每一棵子树。 先根遍历序列为&#xff1a;ABECFHGD。 &#xff08;2&#…

齐护K210系列教程(二)_点亮板载灯

文章目录 1&#xff0c;程序的上传2&#xff0c;点亮板载R-G-B三色灯2-1 齐护编程块方式 2&#xff0c;红色呼吸灯&#xff08;渐亮渐灭&#xff09;4&#xff0c;RGB幻彩呼吸灯联系我们 1&#xff0c;程序的上传 接上节课&#xff0c;我们选择板卡【MicroPython[QDPK210_AIst…

Spring Boot入门(21):使用Spring Boot和Log4j2进行高效日志管理:配置详解

Spring Boot 整合 Log4j2 前言 Log4j2是Apache软件基金会下的一个日志框架&#xff0c;它是Log4j的升级版。与Log4j相比&#xff0c;它在性能和功能上有着极大的提升。Spring Boot本身已经默认集成了Logback作为日志框架&#xff0c;但如果需要使用Log4j2来替代Logback&#…

智慧校园:大数据助力校情分析

随着信息技术的快速发展&#xff0c;数据信息资源以井喷的姿态涌现。数据信息的大量涌现给人们带来丰富的数据信息资源&#xff0c;但面对海量的信息资源时&#xff0c;加大了人们对有效信息资源获取的难度&#xff0c;数据挖掘技术正是这一背景下的产物&#xff0c;基于数据挖…

小扎宣布开放 Meta Horizo​​n OS

日前&#xff0c;Meta以“混合现实的新时代”为题的博文宣布向第三方制造商开放Meta Horizon OS&#xff0c;包括华硕、联想和微软Xbox等等&#xff1a; Meta正在朝着为元宇宙建立一个更开放的计算平台的愿景迈出下一步。Meta正在向第三方硬件制造商开放赋能Meta Quest设备的操…

医院信创FTP要进行替代,有什么值得信赖的方案?

信创产业&#xff0c;即信息技术应用创新产业。其发展核心在于通过行业 应用拉动构建国产化信息技术软硬件底层架构体系和全生命周期生态体系&#xff0c;解决核心技术关键环节“卡脖子”的问题&#xff0c;为中国未来发展奠定坚实的数字基础。 2018 年 以来&#xff0c;受“华…

基于Springboot的网课管理系统

基于SpringbootVue的网课管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 课程表 论坛交流 学校公告 后端 学生管理 教师管理 班级管理 课程分类管理…

挑战一周完成Vue3实战项目硅谷甄选Day1:项目初始化、项目配置、项目集成

一、项目初始化 node v16.4.0以上&#xff08;查看node版本 : node -v&#xff09; pnpm 8.0.0&#xff08;npm i -g pnpm8.0.0&#xff09; 在想创建的位置新建文件夹自己命名 在此文件夹下cmd:pnpm create vite 选择如下配置 Project name&#xff08;项目名称&#xff0…

ROS1 驱动USB摄像头 2024年亲测

安装 查看官网文档A ROS Driver for V4L USB Cameras 里面提供了github链接&#xff0c;链接如下&#xff0c;这里要选择develop分支 将这个文件包放到你的工作空间的src目录下&#xff0c;然后回到工作空间编译catkin_make 此时报错no package libv4l2 found 参考stack ov…

【解决NodeJS项目无法在IDEA中调试的问题】使用JetBrains IDEA 2023 调试nodejs项目

项目采用Ant Design Pro React&#xff0c;使用前后端分离开发方式&#xff0c;后端可以很容易的打断点调试&#xff0c;但是前端通过网页进行调试&#xff0c;在IDEA中加了调试断点&#xff0c;但是没有什么用处。 解决方案如下&#xff1a; 点击新建运行配置 新建JavaScrip…

2024 年选择安全运营中心 (SOC) 工具指南

安全运营中心 (SOC) 是对抗网络威胁的前线。他们使用各种安全控制措施来监控、检测和快速响应任何网络威胁。这些控制措施对于确保信息系统全天候安全至关重要。 大型组织中的现代 SOC 与各种安全供应商合作&#xff0c;处理 75 到 100 种不同的工具。让我们探讨一下您可能遇到…

飞凌技术帖 | RK3568开发板的OTA升级教程

说起OTA我们应该都不陌生&#xff0c;它是一种可以为设备无损失升级系统的方式&#xff0c;能将新功能远程部署到产品上。我们不仅可以通过网络下载OTA升级包&#xff0c;也可以通过下载OTA升级包到SD卡或U盘后再对设备升级。 本文将通过飞凌嵌入式OK3568-C开发板来为大家介绍…

如何在Windows中使用NVM,如何在项目中使用NVM(nvm使用详细,如何使用nvm,使用nvm安装和切换各个nodejs版本)

简介&#xff1a;NVM全称Node Version Manager&#xff0c;是一个用于管理 Node.js 版本的工具&#xff0c;它允许你在同一台计算机上安装和切换多个 Node.js 版本。这对于我们来说特别有用&#xff0c;因为不同的项目可能需要不同版本的 Node.js 来运行。这里来记录一下 NPM &…

爬虫中怎么判断一个网页是否包含ajax请求

1、前言 在用爬虫抓取数据的时候&#xff0c;如果一个网页包含ajax请求&#xff0c;由于数据时动态加载的&#xff0c;直接根据网址是不能获取到想要的数据。因此&#xff0c;在爬虫需要首先判断一个网页是否包含ajax请求数据。 2、ajax请求 2.1 什么是ajax请求 AJAX Asynch…

新版ONENET(2024/4/24)通过view3.0可视化保姆级教程(一学就会)附效果图

⏩ 大家好哇&#xff01;我是小光&#xff0c;想要成为系统架构师的嵌入式爱好者。 ⏩上一篇是STM32通过ESP8266连接最新版的ONENET&#xff0c;成功将数据上传之后&#xff0c;本篇文章使用ONENET的view3.0可视化对数据进行可视化做一个详细教程。 ⏩感谢你的阅读&#xff0c;…

Java-AQS的原理

文章目录 基本概述1. 设计思想2. 基本实现 一些关键词语以及常用术语&#xff0c;主要如下&#xff1a; 信号量(Semaphore): 是在多线程环境下使用的一种设施&#xff0c;是可以用来保证两个或多个关键代码段不被并发调用&#xff0c;也是作系统用来解决并发中的互斥和同步问题…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889

在浏览器输入网址,Enter之后发生了什么?

在浏览器输入网址&#xff0c;Enter之后发生了什么&#xff1f; 很多八股文会给出&#xff1a; 1. DNS Resolution2. Establishing a Connection3. Sending an Http Request4. Receiving the HTTP Response5. Rendering the Web Page 但今天我斗胆插入第0.9步URL Parsing&#…