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

相关文章推荐

建立一个手工练习的命令行编译环境

最近要提高手工做题的准确度和熟练度. 先要准备一个最丑陋的编译环境. windows记事本 编译报错后, 要能找到行号. 有可能使用过程, 记事本的设置被改过, 需要将状态栏显示出来,  行号显示...

VC++6.0工具创建文件、编译、链接、运行以及调试基础-顺序结构

熟悉开发环境,程序开发流程,基本调试 1.实验目的和要求 1.熟悉Visual C++ 6.0的集成开发环境; 2.学习完整的C++程序开发过程,理解简单的C++程序结构; 3.学习C++...

VC++程序编译链接的原理与过程

我们在EX10这个工程中,选择菜单中【Build】→【Rebuild All】,重新编译所有的工程文件,可以看到如下输出:    从这个输出中,我们可以看到可执行程序EX10.exe的产生,经过了两个...

QT 中调用ShellExecuteEx 运行CMD.exe 不能运行错误

QT 中调用ShellExecuteEx 运行CMD.exe 不能运行错误 后来发现是调试中环境设置问题,好像是默认的出错了: PATH=$(QTDIR)\bin%...
  • suirosu
  • suirosu
  • 2015年07月13日 17:07
  • 926

VC++编译说明

目 录 第1章 编译步骤    1 第2章 编译源文件    2 2.1 编译器    2 2.2 包含头文件    3 2.3 重复包含    ...
  • Hanford
  • Hanford
  • 2016年11月03日 20:10
  • 1223

便捷的使用QtTest进行批量单元测试

便捷的使用QtTest进行批量单元测试QTestRunner类用于管理被测试类对象,便于进行单元测试:代码如下:qtestrunner.h#ifndef TESTRUNNER_H #define TE...

【高效学习秘诀1】——How to study?

目录目录 学习套路how to study 一 设疑 二 宏观 三 合作 四 运用扩展 总结经过了一段时间的训练,发现学习起来真的很简单,妈妈再也不用担心我的学习啦,so Easy!在介绍这个秘诀之前...

QT+VC6.0安装编译过程

  • 2010年01月10日 15:45
  • 276KB
  • 下载

c++编译过程(1) vc命令行编

  • 2012年03月15日 08:17
  • 46.79MB
  • 下载

OpenTLD源码生成VS2010工程和编译过程

OpenTLD算法是做什么的,我就不多介绍了,很多人前辈都介绍过了。我参考的博客有 庖丁解牛TLD(五)——井底之蛙啦~ OpenTLD C++ 尝试车辆目标跟踪[1] 看了这个挺好玩的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对VC++工程编译过程的梳理
举报原因:
原因补充:

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