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

原创 2016年06月02日 19:50:57

对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>
版权声明:本文为博主原创文章,未经博主允许不得转载。

编写python脚本集成编译vc项目

1.首先必须要先做一个bat的启动器,原因是要制定vc编译器的执行环境 build_all.bat文件内容如下: call "C:\Program Files (x86).......vcvars...
  • davidsu33
  • davidsu33
  • 2015年02月11日 09:54
  • 958

使用bat脚本编译VS工程

一直以为devenv.exe是个gui编译工具,没想到还支持命令行下编译。命令行形式如下:     devenv.exe 解决方案名.sln /rebuild "平台(Win32/x64)|配置(D...
  • lixiangminghate
  • lixiangminghate
  • 2016年05月09日 10:46
  • 5026

【PE】通过批处理脚本命令行编译VS工程

通过批处理脚本命令行编译VS工程
  • SoaringLee_fighting
  • SoaringLee_fighting
  • 2017年09月20日 22:15
  • 235

vc中自定义编译时的输出消息

VC中可以自定义编译输出消息 #pragma message("Insert User-defined Information here!") 但是这样没有文件和行数信息,不能定位。 使用如下方...
  • qinchong637
  • qinchong637
  • 2012年05月02日 16:18
  • 2202

VS添加lib以及对编译过程的总结

本来是想在VS2013添加一个lib的。由此认识到对编译的原理认识不清楚,所以记录一下 先说在vs中添加lib库的方法: 通过设置工程来添加lib库: 1.添加一个项目,右键属性,改变 配置属性-...
  • Angel69Devil
  • Angel69Devil
  • 2016年08月11日 12:46
  • 1231

编译程序原理VS解释程序原理

引言    在备战软考的过程中在复习程序设计语言的时候遇到这么一个考点——解释和编译的原理,并且在做真题的过程中频繁的考查两者的区别,由于复习的不是很到位所以导致丢分,所以小编又重新复习了这一块的知识...
  • u013045437
  • u013045437
  • 2015年10月29日 20:22
  • 2255

VS加快程序编译速度——以VS2013为例

VS加快程序编译速度——以VS2013为例
  • amusi1994
  • amusi1994
  • 2016年12月15日 23:47
  • 3337

vs命令行编译显示编译过程方法

借助cygwin,使用sh脚本 #! /bin/bash echo "start build..." > ./build.log mode="build" if [ "$1" == "1" ]...
  • yufei_email
  • yufei_email
  • 2016年08月24日 16:43
  • 1276

[C编译器]在VS中编译调试C程序

在VS中编译调试C程序
  • u013409439
  • u013409439
  • 2015年04月27日 20:33
  • 1603

VS集成Qt时,VS中的.vcxproj.user 文件相对于Qt的作用

environment : windows 7 + VS2013 + Qt5.3.0 + addin1.2.4 analyse: .vcxproj.user是用户配置文件,保存用户数据的。 ...
  • rach09
  • rach09
  • 2015年04月08日 16:01
  • 2809
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对VC++工程编译过程的梳理
举报原因:
原因补充:

(最多只允许输入30个字)