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>.属性页设置: