VCCLCompilerTool 属性 -VS2013版

来源:互联网 发布:webservice数据丢失 编辑:程序博客网 时间:2024/06/16 18:37

VCCLCompilerTool类型有以下成员:

以下vcxproj项目信息文件例子来分析:

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">    <ClCompile>      <WarningLevel>Level3</WarningLevel>      <PrecompiledHeader>Use</PrecompiledHeader>      <Optimization>MaxSpeed</Optimization>      <FunctionLevelLinking>true</FunctionLevelLinking>      <IntrinsicFunctions>true</IntrinsicFunctions>      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>      <SDLCheck>true</SDLCheck>      <AdditionalIncludeDirectories>F:\temp\vrpn;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>    </ClCompile>    <Link>      <SubSystem>Console</SubSystem>      <GenerateDebugInformation>true</GenerateDebugInformation>      <EnableCOMDATFolding>true</EnableCOMDATFolding>      <OptimizeReferences>true</OptimizeReferences>      <AdditionalDependencies>NoLo_USBHID.lib;vrpn.lib;%(AdditionalDependencies)</AdditionalDependencies>      <AdditionalLibraryDirectories>F:\temp\vrpn\buildout\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>    </Link>  </ItemDefinitionGroup>


1.AdditionalIncludeDirectories:获取或设置目录到include路径中。

它的三种方式:

1>.上面实例中的直接在vcxproj中写入

2>.利用cl.exe文件,使用命令行,比如MAIN.C中需要包含它所使用头文件的路径时,使用/I选项(可与GCC编译器类比理解):

CL /I \INCLUDE /I\MY\INCLUDE MAIN.C

3>.直接在属性页设置


2.PreprocessorDefinitions:获取或设置预处理定义。为源文件定义一个预处理标志。

它的三种方式:

1>.上面例子中直接添加到vcxproj。

2>.使用CL命令行/D选项,它与在文件开头#define定义一个宏起到的作用是一样的。它的格式如下:

/Dname[= | #[{string | number}] ]

默认情况下,/Dname是等于1的,它是与宏条件#ifdef #endif这些配合起来使用的。 比如以下代码例子,以/DTEST 编译它,TEST这个宏默认即为1:

// cpp_D_compiler_option.cpp// compile with: /DTEST#include <stdio.h>int main( ){    #ifdef TEST        printf_s("TEST defined %d\n", TEST);    #else        printf_s("TEST not defined\n");    #endif}


整个编译过程,可以这样进行:

首先找到VS2013的开发人员命令提示这个工具,可以通过以下步骤查找:


Windows窗口左边找到VS 2013的目录,在它下面有一个Visual Studio Tools,打开后:


以管理员权限打开它后,切换到磁盘根目录,创建一个test目录,进入test目录,在test目录下使用notepad编辑器创建编辑一个test.c文件,将上面的代码例子拷贝进去,之后运行它,可看到得到的结果是1,也就是证明了/DTEST默认情况下的值是为1:


还可以改为/DTEST=3:


当要在DEBUG模式下编译时,可定义DEBUG标志:

CL /DDEBUG test.c

3>.是通过属性页来设置:




3.还有一个比较常用的:RuntimeLibrary,它的作用是获取或设置用于链接的运行时库,运行时库Windows都是以DLL(动态)或Lib(静态)形式出现,Linux以.so(动态)与.a(静态)出现的。

1>.在代码中设置,比如设置一个多线程MultiThreadedDLL时:

<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>

2>.使用命令行参数,它有/MD /MDd /MT /MTd /LD /LDd这些参数可选:

/MD:使应用程序使用运行时库的多线程与DLL版本。定义_MT与_DLL会使得编译器将库文件MSVCRT.lib放到.obj文件中去。

使用这个选项编译的应用程序会静态的链接到MSVCRT.lib文件上,该库提供了一个代码层来让链接器能够解析外部的引用。实际处理逻辑流程的工作代码时位于库文件MSVCReversionnumber.DLL中的,它在应用程序链接到库文件MSVCRT.lib期间必须时可用的。

/MDd:定义_DEBUG,_MT以及_DLL可使得应用程序使用debug版本的多线程与DLL库,它也会使得MSVCRTD.lib文件在编译时放到.obj上。

/MT:使得应用程序使用多线程的静态运行时库版本。定义_MT宏会使得编译器将库文件LIBCMT.lib放到.obj文件中去,因为链接器将会使用LIBCMT.lib文件来解析外部的symbol。

/MTd:定义_DEBUG与_MT宏会使得编译器将库文件LIBCMTD.lib放到.obj文件中去,因为链接器将会使用LIBCMTD.lib文件来解析外部的symbol。

/LD:

1>.创建一个DLL文件。传入/DLL选项到链接器后,链接器就会查找而不是请求一个含有DllMain的函数。如果此时没有写DllMain函数的话,链接器就会插入一个返回true的DllMain函数。

2>.链接DLL启动代码。

3>.创建一个导入库(.lib),如果没有在命令行上指定导出文件(.exp)。可以链接导入库到应用程序来调用DLL。

4>.将/Fe选项功能变为命名dll文件而不是exe文件,/Fe是给exe文件命名的,它能指定文件的名字和文件存放的路径。因此,默认的程序名会是basename.dll而不是basename.exe。

除非明显的指出是/MD,否则默认的都是/MT选项

/LDd:创建一个debug的DLL,定义宏_MT与_DEBUG。

3>.属性页设置:


msdn参考资料


原创粉丝点击