< IDE编程环境配置>

IDE编程环境配置

LIB,DLL区别

我们在写项目时会链接(调用)第3方库,或者比如在vs的解决方案solution创建项目project时,不仅可以开发可执行程序exe(可单独运行)(windows/控制台 应用程序),也可以开发自定义库(不可单独运行,只能在应用程序被调用)(DLL动态库,LIB静态库)

库是一个二进制文件,包含了源文件中(.cpp 或 .c),头文件相反,头文件仅包含声明信息

静态库(.lib静态库文件)

静态库存储了实际的数据和函数

当编译器链接库时,会从库中复制这些函数,并和我们的应用程序一起组合为exe可执行文件,最终的可执行文件exe会比较大

发布时仅发布这个可执行文件就行

静态链接库中不能再包含其他的动态链接库或者静态库

动态库(.dll动态库文件)辅助文件:(lib引入库/导入库文件)

引入库文件(.LIB)包含DLL导出的函数和变量的符号名,而.DLL文件包含该DLL实际的函数和数据

编译时仅需要链接LIB引入库文件,DLL中的函数代码和数据并不可复制到可执行文件

运行时,会根据LIB的地址符号表,从DLL库查找导出的函数

发布时不仅要发布这个可执行文件,也要发布DLL动态库文件

动态链接库中还可以再包含其他的动态或静态链接 库

优点:

内存优化:只有exe调用了函数时,才会被加载到内存中,从而可以减少exe文件的大小

代码共享/模块化/跨平台兼容性/插件支持:因为并非像静态库一样被复制到exe中,而是调用了什么什么就被加载,因此有较高的灵活性

VSIDE中LIB,DLL库配置

DLL

使用时只能使用dll中导出的函数,未导出的函数只能在dll内部使用

隐式连接

需要三个文件

*.h头文件

需要include 包含导出函数的头文件

  • 可以直接写绝对路径
  • 可以拷贝到src源码目录下
  • 也可以配置项目属性,VC++目录->包含目录,或者,C/C++->常规->附加包含目录
lib引入库
  • 可以添加到项目project中,确保选中目标项目,选中要添加的库:”添加”–>”现有项”–>选择lib文件
  • 可以配置项目属性,链接器->常规->附加库目录,然后,链接器->输入->附加依赖项(库名)
DLL库
  • 直接拷贝,将dll拷贝到运行时目录,与调用者exe文件在同一目录
  • 可以配置项目属性,VC++目录->可执行目录,并且,调试 ->工作目录

LIB

*.h头文件

.lib静态库

……和上述一样

DLL库使用

我们要手动控制dll中函数哪些被导出,哪些仅在内部使用,

并且是被导出还是导入,在生成dll的时候我们希望导出,在使用dll时则时希望导入符号

__declspec关键字可以作用于,类,函数,变量

_declspec(dllimport) 导入

 __declspec(dllexport)导出

使用时通常通过宏,如果项目定义了DLLEXPORT导出宏,那么宏_DLL_DECLARE_ 即为导出

否则_DLL_DECLARE_为导入

#ifdef DLLEXPORT
#define _DLL_DECLARE_ declspec(dllexport)
#else
#define _DLL_DECLARE_ declspec(dllimport)

名词

编译器:可以完成从预编译编译,汇编,链接整个过程,将高级编程语言(如C、C++、Java等)编写的源代码转换为机器语言,使得高级语言编写的文件能够被计算机执行

  • 编译器执行过程:
  • 预编译(Preprocessing)
  • 使用g++的-E选项将hello.cpp和包含的头文件预编译为hello.i
  • 编译(Compilation)
  • 使用g++-S选项将hello.i编译为汇编代码文件hello.s
  • 汇编(Assembly)
  • 使用g++-c选项将hello.s汇编为目标文件hello.o(翻译为机器指令)
  • 链接(Linking)
  • 使用g++hello.o链接为可执行文件hello.exe
g++ main.cpp -o main

IDE(Integrated Development Environment)集成开发环境:它集成了代码编辑器、编译器、调试器、图形用户界面工具等多种功能,使得开发者可以在一个统一的界面中完成代码编写、编译(例如vs中的build构建)、调试、运行等所有开发任务。

GNU:操作系统,包含GCC(编译器),Linux内核,和其他的GNU工具集(Emacs编辑器,GDB调试器等)

GCC(GNU Compiler Collection,GNU编译器集合)编译器:支持多种编程语言(如C、C++、Objective-C、Fortran等)和多种计算机体系结构(如x86、ARM等)GCC/G++编译器:GCC专门编译C语言,G++专门编译C++语言

MSVC(Microsoft Visual C++)编译器:微软公司开发专有的C++编译器,提供了丰富的库和工具来支持Windows平台的应用程序开发,被Visual Studio IDE所集成

MinGW(Minimalist GNU for Windows)编译器:包括GCC编译器和适用于Windows的头文件和库,开源,跨平台性

运行时库:支持程序运行的基本函数的集合,一般是静态库lib或动态库dll。

SDK:软件开发工具包

构建工具:

对于大型项目,手动列出所有源文件编译,可能会变得繁琐且容易出错,为了防止每次编译都要执行大量的命令,我们使用构建工具,

负责整个项目的构建过程,包括调用编译器、链接器、测试框架等,它们通常会读取项目配置文件(如Makefile、CMakeLists.txt、Premake脚本等),这些文件定义了项目的结构、依赖关系、构建步骤等,然后调用系统编译器进行项目构建

这样只用使用make等命令,就可以编译链接项目配置文件里配置的文件了

make构建工具:适合简单的、不需要跨平台的项目构建,

Cmake构建工具:跨平台,自定义语言,适合需要跨平台支持的大型项目,提供了丰富的功能和更好的可维护性。

Premake构建工具,跨平台,lua语言,提供了高度的灵活性和可扩展性,适用于各种规模和复杂度的项目。

在Window通过命令行使用MSVC编译C++项目

下载MSVC:

在window系统中,包含MinGW和MSVC编译器,如果想要使用MSVC,首先应下载(Visual Studio Installer(集成MSVC),再选择单个组件(MSVC和SDK)安装)

配置Path环境变量和测试:

参考下载MSVC和Path配置和测试

参考Path配置和测试创建项目:

在某盘创建一个文件夹,创建一个main.cpp文件,输入c++代码

编译:
cl main.cpp(自定义文件名)

使用MSVC的cl编译命令,就可以编译为exe文件了

如果是MinGW的化需要使用g++命令

运行:
main.exe

到此如果成功输出代码运行结果,MSVC就在window上配置成功了 

vscodeIDE使用MSVC的cl.exe编译C++项目(单文件/多文件)

官方文档

不同于vs,配置相对麻烦些

配置编译器:

方法一:

根据上述配置好vscode使用的编译器(MSVC)的Path

方法二:

在linux和mac下gcc或者clang都是直接可以在全新的shell中敲指令的,但是在windows的powershell/cmd 中,MSVC的编译器无法直接使用

如果想要使用可以配置path,但因为MSVC的path配置很多,为了省事其实我们可以直接启用(Developer Command Prompt)

它自动包含Visual Studio的路径和其他必要的环境变量,使得开发者可以直接使用Visual Studio的库和工具(如编译器、链接器和构建工具等),而无需手动配置环境变量。

 在终端中可以通过一下命令检查环境变量是否导入,如果能见到一大堆东西,则导入成功

在cmd中

echo %INCLUDE%

在PowerShell中

echo $env:INCLUDE

通过code命令打开vscode 

配置插件:

安装扩展"C/C++“

创建测试项目:

在某盘创建一个文件夹并用vscode打开,

创建一个main.cpp文件,func.cpp,add.h,总共3个测试文件

建立obj目录负责输出.o文件,

建立build目录建立debug文件,负责配置信息,这里指定了输出目录和名词,指定了编译的源文件

/Fe:"bin\hello" /MTd src\main.cpp src\func.cpp

建立bin负责输出exe文件

配置文件:
.vscode:

用于存储与项目相关的配置信息,(如下)

settings.json

用于存储用户级别的设置或项目级别的设置,可以在这里配置编辑器的一些行为

configuration.json:配置项目

F1->Edit configuration(JSON)

主要用于配置、编译器路径、头文件搜索路径、IntelliSense智能感知(代码自动补全、语法检查等)等信息

  • name:配置的名称,通常用于标识不同的配置,如 "Win32"、"Linux" 或 "Custom" 等。

  • includePath:指定头文件搜索路径的列表。VS Code 会在这些路径中搜索 #include 指令引用的头文件。支持使用占位符和环境变量,如 ${workspaceFolder} 表示当前工作区的根目录。

  • defines:定义预处理器宏的列表。这些宏会在IntelliSense引擎解析代码时被使用,模拟编译器预定义宏的效果。

  • compilerPath:指定C/C++编译器的路径。VS Code将使用这个路径来获取编译器相关信息,如系统包含路径和默认定义,以启用更准确的IntelliSense。

  • intelliSenseMode:设置IntelliSense模式,通常根据编译器和架构选择。常见的值包括 gcc-x64gcc-arm64msvc-x64clang-x64 等。

  • cStandard 和 cppStandard:分别设置用于IntelliSense的C和C++语言标准版本。例如,c11 表示C11标准,c++17 表示C++17标准。

  • browse:配置用于浏览代码时的额外选项,如搜索路径和符号数据库的设置。

{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","${env:INCLUDE}"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"compilerPath": "D:\\VisualStudioSetup3\\VC\\Tools\\MSVC\\14.36.32532\\bin\\Hostx64\\x64\\cl.exe", /* 编译器路径 */"windowsSdkVersion": "10.0.22000.0","cStandard": "c17","intelliSenseMode": "windows-msvc-x64","compilerArgs": [ /* 编译器参数 */"-fexec-charset=GBK"]}],"version": 4
}
tasks.json:配置任务

Terminal->Configure  task->create tasks,json file from template->others

用于定义任务(Tasks),这些任务可以是编译代码、运行测试、清理输出目录等

备注
“label”“……”标签值。用于VSCode识别你的任务,相当于给任务起个名。
“type”“shell”任务类型。shell(控制台程序),process(任务将作为一个独立的进程运行)。
“command”“cl”

要执行的命令。这里我们就是msvc的编译器cl

“args”“……”

为你的指令加上各种参数。/Fo是输出目录,/Fe是重命名

"/Zi":生成包含程序数据库(.pdb)的完整调试信息的程序。

"/Od":禁用优化。这有助于调试,因为生成的代码更接近源代码。

"/EHsc":启用C++异常处理,并且假定使用标准C++异常处理机制。

“problemMatcher”“$msCompile”

问题匹配器。这告诉VS Code如何从任务输出中解析错误和警告。$msCompile是一个预定义的模式,用于匹配Microsoft编译器的输出。

“detail”“…balabala”任务的细节说明,方便日后VSCode用它来提示你。

"group":”任务分组信息 

/* 任务集:包含若干任务,每个任务具有一些字符串形式的键或者属性 */
{"tasks": [{"label": "build debug Win32", /* 标签 */"type": "shell", /* 任务类型 */"command": "cl", /* 调用指令 */"args": [// "/Fe: bin\\","@build\\Debug","/Fo:obj\\","/Zi","/Od","/EHsc",// "src\\main.cpp"],"group": {"kind": "build","isDefault": true},"problemMatcher": ["$msCompile"]}]
}
launch.json:配置调试器

用于配置调试器,定义如何启动和调试应用程序

{"version": "0.2.0","configurations": [{"name": "cl.exe - 生成和调试活动文件","type": "cppvsdbg","request": "launch","program": "${workspaceFolder}/bin/hello.exe","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"preLaunchTask": "build debug Win32" // 确保这个任务名称与 tasks.json 中的一致  }]
}

编译,运行和调试

编译:Terminal->Run Task->build debug Win32

运行/调式:Run->Start Debugging/F5

输出结果

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

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

相关文章

Spring Boot与iTextPdf:高效生成PDF文件预览

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 在现代应用程序开发中,生成PDF文件是一个常见的需求。PDF文件因其跨平台性和易读性,被广泛应用于文档交换、报告生成和打印预览等场景。Spring Boot作为一个用于简化Spring应用开发的框…

【python】追加写入excel

输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…

MySQL 数据库的备份与恢复

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

TS系列(7):知识点汇总

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 一、TS是什么? TypeScript 由微软开发,是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容,是 JavaScript 的超集。TypeScript 增加了静态类型检…

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具,通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力,能够在无需特定训练的情况下,在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

Unity3D 客户端多开

Unity3D 实现客户端多开 客户端多开 最近在做好友聊天系统,为了方便测试,需要再开一个客户端。 简单的方法,就是直接拷贝一个新的项目,但是需要很多时间和占用空间。 查阅了网络资料,发现有一种软链接,…

Python水循环标准化对比算法实现

🎯要点 算法区分不同水循环数据类型:地下水、河水、降水、气温和其他,并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动,作为电信全业务运营企业,不仅拥有庞大的客户群体和业务规模,还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量,管理着超过80TB的海量数据,因此也面临着数据规…

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …

阿里云ACP认证考试题库

最近有好些同学,考完阿里云ACP了,再来跟我反馈:自己花700买的阿里云ACP题库,结果答案是错的! 或者考完后发现,买的阿里云ACP题库覆盖率只有50%! 为避免大家继续踩坑,给大家分享一个阿…

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…

使用 Python 遍历文件夹

要解决这个问题,使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树,找到所有的 text 文件,读取内容,处理空行和空格,并将处理后的内容合并到一个新的文件中。 整体思路: 遍历子目录&#xff1…

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2694 标注数量(xml文件个数):2694 标注数量(txt文件个数):2694 标注…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念,不涉及具体的操作原理,旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期,计算机主机非常昂贵,而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

关于CSS 案例_新闻内容展示

新闻要求 标题:居中加粗发布日期: 右对齐分割线: 提示, 可以使用 hr 标签正文/段落: 左侧缩进插图: 居中显示 展示效果 审核过不了&#xff0c;内容没填大家将就着看吧。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…