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编译器指令,后续的编译步骤中要用到该指令。
经过预编译的处理以后,头文件被合并到源文件中,并且所有的宏定义都被展开。
编译阶段

依赖于编译器,英文是compile,编译阶段将源程序(*.c 或者*.cpp)转换成为目标代码*.obj;

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

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

2、生成:指的是链接的过程,英文是build.依赖于链接器. vc中在这一阶段将所有的目标文件和所有需要用到的组件组合成一个整体,例如需要生成的是windows系统下的PE可执行文件,链接器会依照特定格式将目标文件组合,最后生成PE格式的.exe或.dll文件。

总结:

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

 

3、调试:是所有或部分代码编写完成后,让程序在调试器中运行,用这种手段对程序进行分析,找出并修正潜在问题。
4、运行:就是让程序在系统中运行。

 

应用:

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>
1
2
3
4
5
6
7
8
9
10
11
12
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的编译过程 的相关文章

随机推荐

  • C++ 线程及线程池详解

    目录 一 前言1 参考链接2 编译参数 二 std thread1 构造函数2 公共成员函数2 1 get id 2 2 join 2 3 detach 2 4 joinable 2 5 operator 61 2 6 native han
  • 在MAC第一次使用python,安装PyCharm以及设置环境

    在MAC的系统上一般都有Python的环境 不过一般都是Python2 的 而现在大多都会用Python3 如果你不知道Python是什么版本的可以在 Launchpad 上面的搜索 搜索终端 输入Python 如下 开头便是Python2
  • (14)写一个函数,将两个字符串连接

    写一个函数 xff0c 将两个字符串连接 程序分析 xff1a 用户在控制台输出第一个字符串后按下回车键继续输出下一个字符串 需要加上getchar 读取换行符 xff0c 若不进行处理程序会将换行符也连接到新的字符串中 span clas
  • CMAKE error

    今天的CMAKE中出现下面的错误 xff1a CMake Error at CMakeLists txt 19 TARGET LINK LIBRARIES Cannot specify link libraries for target 3
  • 开源SIP服务器OpenSIPS应用介绍

    1 引入 随着通信IP化的发展 xff0c IP传输的高带宽 低成本等优势使得越来越多的企业 电信运营商加快建设基于IP的各种通信应用 在通信协议IP化发展中 xff0c SIP协议毫无争议地成为各大电信运营商构建其未来网络的基础协议 xf
  • Ubuntu 18.04 apache2 搭建http文件服务器

    在我们日常的开发过程中 xff0c 需要创建一个http 文件服务器 用于调试 比如直接使用 wget 获取文件 代替 插拔SD卡 xff08 用sd卡拷贝 xff09 1 安装 apache2 apt get update apt get
  • CentOs安装nginx服务器,能够在远端通过http和https访问nginx服务器的测试首页内容。

    使用yum install nginx 命令安装nginx 然后通过dnf list nginx命令查询了安装结果 第一次通过sytemctl status nginx 命令进行查看服务启动状态时 xff0c 结果显示dead xff0c
  • SPL06-001 气压计计算与读取

    手册地址 https download csdn net download zhangxuechao 10548473 寄存器 计算方法 举例 气压测量速率 sample sec Background 模式使用 define PM RATE
  • PTA题库 查找字串

    查找子串 本题要求实现一个字符串查找的简单函数 函数接口定义 xff1a span class token keyword char span span class token operator span span class token
  • 怎样防止头文件被重复包含?(两种方式)以及它的影响

    xfeff xfeff 一 头文件被重复包含 include文件的一 个不利之处在于一个头文件可能会被多次包含 xff0c 为了说明这种错误 xff0c 考虑下面的代码 include 34 x h 34 include 34 x h 34
  • linux 条件变量

    在多线程编程中仅使用互斥锁来完成互斥是不够用的 xff0c 如以下情形 xff1a 假设有两个线程 t1 和 t2 xff0c 需要这个两个线程循环对一个共享变量 sum 进行自增操作 xff0c 那么 t1 和 t2 只需要使用互斥量即可
  • Invoke与begininvoke

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate xff0c 至于委托的本质请参考我的另一随笔 xff1a 对 net事件的看法 一 为什么Control类提供了Invoke和BeginInvoke机制
  • 接口成员显示实现

    xff08 interface xff09 用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致 在前面的文章中 xff0c 我们已经对C 接口的概念 xff0c 如何定义接口以及如何对接口进行访问等问题进行了详细的讨论 在这
  • Oracle基础知识整理总结

    1 Oracle跟SQL Server 2005的区别 xff1f 宏观上 xff1a 1 最大的区别在于平台 xff0c oracle可以运行在不同的平台上 xff0c sql server只能运行在windows平台上 xff0c 由于
  • Javascript调用后台方法

    1 javaScript函数中执行C 代码中的函数 xff1a 方法一 xff1a 1 首先建立一个按钮 xff0c 在后台将调用或处理的内容写入button click中 2 在前台写一个js函数 xff0c 内容为document ge
  • Delphi设置某用户对文件(夹)的权限

    以下在代码在D7 43 2003和D7 43 XP中调试通过 unit NTSecurityU interface Uses Windows AclApi AccCtrl Const SECURITY NULL SID AUTHORITY
  • 关于VMWare压缩虚拟机的虚拟磁盘的问题

    随着我们使用虚拟系统的时间越长 xff0c Vmware创建的虚拟磁盘占用空间就越大 xff0c 即使将虚拟系统中的文件删除 xff0c 虚拟磁盘文件占用宿主系统硬盘空间也不会减少 xff0c 这个问题困扰了很多用户 a S 34 N 43
  • GB2312简体中文编码表

    const GB2312 中文编码 CHpb 61 B0 首页码 CHpe 61 F7 尾页码 CHab 61 A1 首地址 CHae 61 FE 尾地址 GB B 61 B0A1 GB E 61 F7FE ChCount 61 chpe
  • 自定义通信协议

    现在大部分的仪器设备都要求能过通过上位机软件来操作 xff0c 这样方便调试 xff0c 利于操作 其中就涉及到通信的过程 在实际制作的几个设备中 xff0c 笔者总结出了通信程序的通用写法 xff0c 包括上位机端和下位机端等 1 xff
  • vc的编译过程

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