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

相关文章推荐

Vs 2008 解决方案的目录结构设置和管理

MS的这个IDE,实在庞杂得恐怖。从大学开始,我就一直用VC的各个版本写程序至今,细细想来,也仅仅是窥豹一斑,羞愧不已。但若仔细翻阅文档,又觉得时间花得不值,于是便一直凑活地用着。 前段时间负责...

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
  • 2387

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Vs解决方案的目录结构设置和管理

以下内容为“原创”+“转载” 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名f...

VC 2005 解决方案的目录结构设置和管理

VC 2005 解决方案的目录结构设置和管理 Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于单元测试...

VC++ 如何发布程序(即release版本程序)

大家都知道VC编译默认生成debug版本的程序,但是debug版本程序无法运行在没有安装VC 的电脑上,这就要就我们生成release版本的程序,因为release版本在未安装VC的电脑上也能运行。...

VC++中debug跟release编译模式的区别总结

Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当...

使用devenv编译VC项目

devenv是VisualStudio的可执行程序,一般安装在“C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE”下。用来...

VS的vcxproj文件 + 调试技巧之调用堆栈 + 每次重新编译

[摘要]    详细了解vcxproj.filters文件后,你可以在你的解决方案管理器中按照你自己的分类习惯对文件进行分类。每种类别都以文件夹的形式存放,当然只是在解决方案管理器中显示而已。虽然可以...

VC++编译选项详解

优化- []================================================================================[] /O1 最小化空间...

【VC++6.0】成功制作并使用lib库(原创)

微软有许多头文件,这些头文件里面定义了许多函数,但是在头文件中你却找不到函数内容的身影,因为函数主体被保存在了lib库中。保存在库中有一个好处,那就是源代码不容易被发现,也就是说其中的一些技术别人不容...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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