Visual Studio 2010 C++ 工程文件中添加自定义宏
今天直接打开 vcxproj 文件查看了一下,发现工程文件中有如下一行:
<PropertyGroup Label="UserMacros"/>
于是在网上搜索了一番,没有发现太多有用的资料,因此抱着试一试的心情在该元素中增加了一些自定义宏,如下所示:
<Suffix Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">UD32</Suffix>
<Suffix Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">UD64</Suffix>
<Suffix Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">UR32</Suffix>
<Suffix Condition="'$(Configuration)|$(Platform)'=='Release|x64'">UR64</Suffix>
增加上面的内容的目的是我的工程设置为 Unicode 字符集,同时针对不同的配置项目在输出的文件名的最后可以增加一个后缀,因此上面宏的内容的意思就是:字符集为 Unicode ,配置项目为: D=Debug R=Release ,平台为:32=X86 上的 32 位程序 64=x64上的 64 位程序;
然后在输出配置项目中将 TargetName 统一设置为:$(ProjectName)$(Suffix) ,(注:此时在工程的宏列表中已经可以看到 Suffix 并且配置不同时起内容也不同)编译发现输出的动态库文件名已经已经根据配置自动的增加了后缀;
如果需要配置多个宏,那么 Condition 属性就重复了,通过观察 vcxproj 文件发现向导生成的<PropertyGroup>中包含有 Condition ,于是作如下的修改:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="UserMacros">
<Author>WonKerr</Author>
<Suffix>UD32</Suffix>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="UserMacros">
<Author>WonKerr</Author>
<Suffix>UD64</Suffix>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="UserMacros">
<Author>WonKerr</Author>
<Suffix>UR32</Suffix>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="UserMacros">
<Author>WonKerr</Author>
<Suffix>UR64</Suffix>
</PropertyGroup>
然后使用 VS2010 打开该工程,查看属性,发现能够正确的识别,呵呵,这样针对不同的配置增加自己的特定的宏就方便多了;
最后再分享一个自定义宏的方式,在上面的例子中如果 Author 在不同的配置中其实内容都是相同的,为了避免重复配置,可以将该宏配置在全局属性组中,如下所示:
<PropertyGroup Label="Globals">
<ProjectGuid>{D7E40A8B-116F-487A-9966-9F7B92942913}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<SccProjectName>SAK</SccProjectName>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
<SccProvider>SAK</SccProvider>
<Author>WonKerr</Author>
</PropertyGroup>
呵呵,这样一来可以把一些设置放置到全局属性组中,后面使用$()的形式引用这样就方便多了;
补充:$(ProjectName)的默认值是工程文件的名称,例如 MyProj.Unicode.vcxproj 的工程名默认为 MyProj.Unicode ,可以通过在全局属性组中增加定义来覆盖默认的工程名称,增加下面一行即可将工程名修改MyProj
<PropertyGroup Label="Globals">
<...></...>
<ProjectName>MyProj</ProjectName>
<...></...>
</PropertyGroup>