对VC++工程编译过程的梳理

2023-05-16

对VC++工程编译过程的梳理

VC++的项目和解决方案文件解读,无非就是利用这些信息进行一个软件的编译,这些文件里面是存放的项目的配置和工程的组织,类似于makefile文件. 但是只有VC++6.0的时候可以导出makefile文件,VC6的project>Export MakeFile,往后的版本都取消了。 所以只能从各个文件中去获取相关信息,最后才编译。

编译器MSBuild (VCBuild) 调用配置文件:

文章参阅MSDN上的MSBuild (Visual C++)

  • .vcxproj:工程配置文件
  • .props:使用项目属性表可以为生成工具(如编译器或链接器)指定开关并创建用户定义的宏。
  • .vcxproj.user:用户文件,存储特定于用户的属性,例如调试和部署设置。vcxproj.user 文件应用于特定用户的所有项目。
  • .vcxproj.filters:当使用解决方案资源管理器向项目中添加文件时,筛选器文件 (.vcxproj.filters) 会基于该文件的文件扩展名定义在解决方案资源管理器树视图的哪个位置添加该文件。

获取配置

当编译程序时,会把上面几个文件中所有信息输入到编译器中,结合目前编译器的全局参数include files lib files source files等等,从配置文件中确定标准库和头文件的位置,使所有参与编译的依赖关系都找清楚。

编译预处理阶段

读取源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理;

  • 将所有的“#define”指令删除,并且将宏定义展开;
  • 处理所有的条件编译指令;
  • 处理#include预编译指令,将被包含的头文件插入到预编译指令的位置。这可能是一个递归操作,如果被包含的头文件中又包含其他头文件;
  • 删除所有的注释;
  • 添加行号和文件标识;
  • 保留所有的#program编译器指令,后续的编译步骤中要用到该指令。
  • 经过预编译的处理以后,头文件被合并到源文件中,并且所有的宏定义都被展开。

编译阶段

编译阶段将源程序(*.c 或者*.cpp)转换成为目标代码*.obj;

  • 以预编译的输出为输入,将C++源代码翻译成计算机系统应将能够识别的二进制机器指令,并将编译的输出结果存储在COFF格式的目标文件中。在编译的中间过程中,还可以通过cl命令选择性地输出汇编语言格式的中间文件。
  • 在执行编译的时候,编译器以“.cpp”文件为单位,对于每一个“.cpp”文件,编译器都会输出一个目标文件。

链接阶段

连接阶段是把源程序转换成的目标代码(obj文件)与你程序里面调用的库函数对应的代码连接起来形成对应的可执行文件(exe文件)就可以了;

总结:

见简简单单的回顾了编译的过程,重点想说的是在前面的获取配置阶段,用户自定义的路径,参数等都会读入编译器,解析出来.

应用:

mySerialPortTools.vcxproj.user 中定义了QTDIR

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <QTDIR>D:\Qt\Qt5.7.0\5.7\msvc2015_64</QTDIR>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <QTDIR>D:\Qt\Qt5.7.0\5.7\msvc2015_64</QTDIR>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>

mySerialPortTools.vcxproj文件中会直接用这个参数QTDIR

    <ClCompile>
      <AdditionalIncludeDirectories>.;$(QTDIR)\include;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtCore;temp\moc;$(QTDIR)\mkspecs\win32-msvc2015;.\GeneratedFiles;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalOptions>-Zc:strictStrings -Zc:throwingNew %(AdditionalOptions)</AdditionalOptions>
      <AssemblerListingLocation>temp\obj\</AssemblerListingLocation>
      <BrowseInformation>false</BrowseInformation>
      <DebugInformationFormat>None</DebugInformationFormat>
      <ExceptionHandling>Sync</ExceptionHandling>
      <ObjectFileName>$(IntDir)</ObjectFileName>
      <Optimization>MaxSpeed</Optimization>
      <PreprocessorDefinitions>_WINDOWS;UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_WIDGETS_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessToFile>false</PreprocessToFile>
      <ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
      <RuntimeTypeInfo>true</RuntimeTypeInfo>
      <SuppressStartupBanner>true</SuppressStartupBanner>
      <TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
      <WarningLevel>TurnOffAllWarnings</WarningLevel>
    </ClCompile>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对VC++工程编译过程的梳理 的相关文章

  • 分布式之数据库和缓存双写一致性方案解析

    本文转自博客园 作者 xff1a 孤独烟 原文链接 xff1a https www cnblogs com rjzheng p 9041659 html 为什么写这篇文章 首先 xff0c 缓存由于其高并发和高性能的特性 xff0c 已经在
  • Hexo操作指南-(命令)

    Hexo命令说明 xff1a Hexo官方文档 xff1a https hexo io zh cn docs hexo init 新建一个网站 hexo new 34 文章名 34 新建文章 hexo new page 34 页面名 34
  • 面试题:谈谈对进程的理解?谈谈你对线程的理解?2.进程死锁的原因?如何解决进程死锁?

    2 谈谈对进程的理解 xff1f 答 xff1a 首先进程是指在系统中正在运行的一个应用程序 xff1b 程序一旦运行就是进程 xff0c 或者更专业化来说 xff1a 进程是指程序执行时的一个实例 xff0c 即它是程序已经执行到课中程度
  • 编程小白用C语言完成"摸球问题"

    碰到问题 编写一个程序 xff0c 从 3 个红球 xff0c 5 个白球 xff0c 6 个黑球中任意取出 8 个球 xff0c 且其中必须有红球 xff0c 输出所有可能的方案 思路分析 依题意 必须有红球 即红球最少有1个 最多有3个
  • wxX11移植到arm板上

    原 移植wxX11到开发板上 2012 5 18阅读467 评论0 最近几天由于工作安排 xff0c 要将wxX11程序移植到arm开发板上 一连工作了好几天 xff0c 终于可以在板子上显示出一个 X 号 xff0c 并且可以运行wxWi
  • 13.3.2 搜索本地磁盘中所有媒体文件

    13 3 2 搜索本地磁盘中所有媒体文件 搜索本地磁盘中所有媒体文件可以利用 13 3 1 小节设计的 link add dir 函数 xff0c 将该函数搜索的路径设置为 如下列源代码所示 xff1a int link search li
  • 使用Systemctl命令来管理系统服务

    导读Systemctl是systemd用于管理系统和管理服务的工具 许多现代Linux发行版 xff0c 如Ubuntu Debian Fedora Linux Mint OpenSuSE Redhat都采用systemd作为默认的init
  • MySQL循环语句

    导读mysql常见的三种循环方式 xff1a while repeat和loop循环 还有一种goto xff0c 不推荐使用 Linux就该这么学 1 while循环 设置mysql分隔符为 xff0c 也就意味着 xff0c 当遇到下一
  • Controller和RestController的区别

    导读在springboot中 xff0c Controller RestController是使用控制器最常用的两个注解 xff0c 但是两者之家的差异你知道吗 xff1f 本文就是要讲述两者之间的区别 1 Controller RestC
  • 工作站和台式机的区别

    转自 xff1a 微点阅读 xff08 www weidianyuedu com xff09 微点阅读 范文大全 免费学习网站 工作站电脑非常高配 xff0c 那么它和台式机有什么区别呢 下面由小编给你做出详细的工作站和台式机区别介绍 希望
  • 抽象类不可以被实现,但可以有构造方法

    抽象类不可以被实现 xff0c 但可以有构造方法 xff01 在创建类的时候会调用对应类的构造方法 xff0c 抽象类不能被实例化 xff0c 按理来说在抽象类中写构造方法是没用的 xff0c 但抽象类的子类在被继承的时候必须实现抽象类中的
  • 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法

    matlab 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法 xff0c 它们是 自回归 AR 移动平均线自回归移动平均线自回归积分移动平均线 ARIMA 季节性自回归积分移动平均线 SARIMA 具有外生回归
  • Android自定义定时闹钟开发详解

    导读这篇文章主要为大家详细介绍了Android自定义定时闹钟开发 xff0c 文中示例代码介绍的非常详细 xff0c 具有一定的参考价值 xff0c 感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Android开发之自定义闹钟实现 xf
  • 如何在 Linux 上安装 AWS 命令行工具

    导读AWS CLI 是一个能够和 AWS 账户进行交互的命令行程序 开发者和系统管理员用它管理日常的活动和自动化 本文讲述如何一步步在 Linux 上安装 AWS CLI xff08 命令行工具 xff09 AWS CLI 是一个能够和 A
  • Python实现对比两个Excel数据内容并标出不同

    导读 日常工作中需要对比两个Excel工作表中的数据差异是很不方便的 xff0c 使用python来做就比较简单了 xff01 本文为大家介绍了python实现对比两个Excel的数据内容并标记出不同数据的示例代码 xff0c 需要的可以参
  • Python中列表遍历使用range和enumerate的区别

    导读这篇文章主要介绍了Python中列表遍历使用range和enumerate的区别 在Python编程语言中 xff0c 遍历list有range和enumerate方法 xff0c 本文结合示例代码给大家介绍的非常详细 xff0c 对大
  • ChatGPT 引入关闭聊天记录功能

    导读OpenAI 宣布在 ChatGPT 中引入了一项新功能 xff0c 允许用户关闭聊天记录 相关控件目前已面向所有用户推出 xff0c 可以在 ChatGPT 的设置中找到 xff0c 并且可以随时更改 公告指出 xff0c 用户在禁用
  • 虚拟机与主机互传文件方法分享

    现在虚拟机的使用已经非常普及 xff0c 无论新手学习 xff0c 还是运维工程师搭建虚拟化平台 xff0c 都会使用到虚拟机 对个人用户来说 xff0c 非常方便就能搭建很多操作系统进行学习 xff1b 对企业用户来说更是降低了服务器的硬
  • 在 Centos7 的KVM上启用嵌套虚拟化

    嵌套虚拟化 意味着在虚拟机内配置虚拟化环境 换句话说 xff0c 我们可以说嵌套虚拟化是虚拟机管理程序hypervisor的一个特性 xff0c 它允许我们通过虚拟化管理程序 xff08 宿主机 xff09 的硬件加速在虚拟服务器内安装和运
  • 详解:Linux Chrony 设置服务器集群同步时间

    导读Chrony是一个开源的自由软件 xff0c 像CentOS 7或基于RHEL 7操作系统 xff0c 已经是默认服务 xff0c 默认配置文件在 etc chrony conf 它能保持系统时间与时间服务器 xff08 NTP xff

随机推荐

  • Linux:快速查看IP地址及修改IP地址

    导读Linux下如何快速查看IP地址及修改IP地址 xff0c 有一个方法供参考 查ip 方法 步骤1 打开linux操作系统在进入到界面 方法 步骤2 在桌面右击打开终端 方法 步骤3 终端里输入ifconfig a命令在回车键 方法 步
  • Centos安装vncserver虚拟网络控制台

    虚拟网络控制台 xff08 VNC xff09 是一个图形桌面共享软件 xff0c 允许您使用键盘和鼠标远程控制另一台计算机 系统环境 服务端 xff1a Centos7 7 Minimal客户端 xff1a Windows10客户端VNC
  • java线程池线程超时关闭的两种我认为比较好的方式

    问题 xff1a 比如多线程进行io操作的时候 xff0c io的读取在等待的时候 xff08 比如telnet某端口时 xff0c 会长时间等待 xff09 xff0c 线程是不会关闭的 xff0c 这样导致线程不释放 xff0c 早晚凉
  • Ubantu 22.04.2安装教程 + VMWare Tools + 百度网盘 + Anaconda + Pycharm安装

    目录 前言 一 Ubantu安装 二 VMWare Tools安装 三 百度网盘安装 四 Anaconda 五 Pycharm 前言 最近在研究Linux xff0c 决定整合一下教程 xff0c 以便日后的师弟师妹使用 一 Ubantu安
  • 个性化定制你的命令行

    如果您很容易使shell 提示行变得色彩绚烂斓且带有更多信息 xff0c 为什么还要坚持用单调的标准 shell 提示行呢 xff1f 在这篇技巧中 xff0c Daniel Robbins 将说明如何获得符合您的意愿的shell提示行 x
  • Android中viewBinding的简单用法

    初级菜鸟 xff0c 正在向中级菜鸟努力 xff01 刚刚接触Android开发 xff0c 有好多东西都不太懂 xff0c 又喜欢忘东西 xff0c 干脆写博客记录一下吧 目录 在activity中使用viewBinding 在Fragm
  • python爬虫实战 | 批量爬取开放服务器的文件

    今天在查有关spss modeler的参考资料时 xff0c 发现了这个网站 xff1a ftp public dhe ibm com software analytics spss documentation modeler 14 2 z
  • 一个图的连通子图个数

    问题描述 xff1a 给出一个无向图 xff0c 输出图中连通分支的个数 无向图的连通分支是一个子图 xff0c 因此在子图两个节点之间至少存在一个路径 输入 xff1a 给出一个连通图的二维数组 01000 10100 01000 000
  • IT牛人博客聚合 - Linode日本东京机房速度飞快 编程牛人 技术牛人

    为了应对亚太地域快速增加的需求 Linode起头把机房建在亚洲了 第一个 Linode 亚洲机房选择在日本东京 我测了下 速度比本来在美国加州快多了 应当首要得益于收集延时的削减 所以 我当即开了张 Support Ticket 将我的 V
  • kali tightvncserver 自启动

    kali创建service自启动 xff0c 文件如下 xff0c kali2021版真的改了好多 xff0c 在这里记录一下 Unit Description 61 TightVNC remote desktop server After
  • 重载new/delete运算符

    下面介绍用重载new delete运算符的方式来实现一个简单的内存泄露检测工具 xff0c 基本思想是重载全局new delete运算符 xff0c 被检测代码调用new和delete运算符时就会调用重载过的operator new和ope
  • 按位与、按位异或、按位取反

    amp 按位与 按位或 按位异或 1 按位与运算 按位与运算符 34 amp 34 是双目运算符 其功能是参与运算的两数各对应的二进位相与 只有对应的两个二进位均为1时 xff0c 结果位才为1 xff0c 否则为0 参与运算的数以补码方式
  • VS断点设置无效的问题

    新的一年第一篇博客点的名字是已经被写烂了的题目 xff0c 并且也是浪费了网友无数的宝贵时间也很难解决的老大难问题 VS无法设定断点问题 先得吐槽一下CSDN的编辑器 xff0c 火狐下竟然无法显示工具条问题 xff0c 可能是因为xhEd
  • 解决Ubuntu安装依赖问题

    解决Ubuntu安装依赖问题 解决Ubuntu安装依赖问题最主要问题 xff0c 修改的国内镜像源可能不是对应的ubuntu版本 xff0c 大部人直接找了个镜像源就复制到source list里面了 xff0c 其实需要对应版本的 xff
  • &与&&有什么区别?

    一 简要说明 按位与 xff1a a amp b 是把 a 和 b 都转换成二进制数然后再进行与的运算 xff1b 逻辑与 xff1a a amp amp b 就是当且仅当两个操作数均为 true 时 xff0c 其结果才为 true xf
  • VC在编译链接的无故死掉解决方案(防VC6卡死)

    现在网上有很多集成了SP6的VC6 xff0c 但是使用起来会有些某名奇妙的问题 xff0c 也许是我用的龙卷风那个版本不行 xff0c 最常见的就是VC在编译链接的时候经常无故死掉的问题了 xff0c 发生时候关也关不掉 xff0c 停也
  • 给纯SDK程序加上自己的ICO图标

    方法一 xff1a 给纯SDK程序加上自己的ICO图标 1 在项目中建一个resource h文件写入一句 define IDR MAINFRAME 128 2 在项目中建一个resource rc写入一句IDI ICO ICON DISC
  • Teechart 的用法详解:在VC6.0 跟Visual Studio 2005及之后版本的区别

    csdn的文件限制导致 xff0c gif图片不清晰 xff0c 我把文章放到简书上了 xff0c 地址 xff1a http www jianshu com p 2f3f6047d99a 什么时候开始接触teechart呢 xff0c 说
  • 为什么现在多数软件都默认选择安装目录为user下的AppData而非Progamfiles?

    为什么放弃默认选择Program Files 我一直百思不得其解 都是UAC xff08 用户权限控制 xff09 惹得祸 自从VISTA引入了权限机制UAC后 xff0c windows7及以后的系统版本 xff0c 对于Program
  • 对VC++工程编译过程的梳理

    对VC 43 43 工程编译过程的梳理 VC 43 43 的项目和解决方案文件解读 xff0c 无非就是利用这些信息进行一个软件的编译 xff0c 这些文件里面是存放的项目的配置和工程的组织 xff0c 类似于makefile文件 但是只有