对VC++工程编译过程的梳理
2016-06-02 19:50
459 查看
对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>
相关文章推荐
- Aut2Exe编译au3脚本为可执行文件
- VC中实现文字竖排的简单方法(推荐)
- CentOS 6.3下编译安装Ruby 2.0笔记
- 把Lua编译进nginx步骤方法
- Lua中编译执行代码相关的函数详解
- Chrome Visual Studio 2005下的编译过程
- Windows下使用Cygwin编译MySQL客户端
- android的编译和运行过程深入分析
- VC中CDC、HDC、pDC区别与联系及相互转换
- VC实现获取当前正在运行的进程
- vc中SendMessage自定义消息函数用法实例
- VC实现让关闭按钮成灰色不可用的方法
- VC++中的字体设置方法详解
- VC程序设计中CreateProcess用法注意事项
- VC实现批量删除指定文件的方法
- vc中使用SendMessage自定义消息函数
- vc提示unexpected end of file found的原因分析
- vc获取计算机名和ip地址的方法
- VC6.0实现读取Excel数据的方法
- VC下通过系统快照实现进程管理的方法