当代码文件成千上万,项目上百,编译一遍需要半天到一天。阅读编写代码时候,找类型 、函数、变量定义实现的效率会急剧下降。
对于这种情况,一个方法是打Tag,通过Tag找。我更喜欢的方法是把这些所有的代码文件加入到一个VC项目中去。通过VC或者VA跳转。
为此写了一段Python 程序 ,生成VC静态库项目 ,把指定目录下所有目录及其所属文件加入到该VC项目。每次更新过代码后,双击重新生成项目。极大地方便了本人代码读写。
代码如下,奉献给大家。
'''
Created on Mar 20, 2014
@author: MRJWT
'''
import os
import os.path
import uuid
filterFilestrHead='''<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
'''
filterFilestrTail='''
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
</Project>
'''
vcprojFileStrHead1='''<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{E22942F7-3844-4D61-8AC7-EE7B0FF82619}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
'''
vcprojFileStrHead2='''
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
'''
vcprojFileStrTail='''
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
'''
def genPrjOnDir(rootdir,rootname,projectname):
fvcproj=open(projectname+".vcxproj","w")
ffilter=open(projectname+".vcxproj.filters","w")
proj_h=[]
proj_cpp=[]
proj_none=[]
filter_h=[]
filter_cpp=[]
filter_none=[]
filter_filter=[]
for parent,dirnames,filenames in os.walk(rootdir):
filterName=parent.replace(rootdir,rootname)
filter_filter.append(' <Filter Include="'+filterName+'">\n')
filter_filter.append(' <UniqueIdentifier>{'+str(uuid.uuid1())+'}</UniqueIdentifier>\n')
filter_filter.append(' </Filter>\n')
for filename in filenames:
filename.lower()
if filename.endswith(".cpp") or filename.endswith(".c") or filename.endswith(".cxx"):
proj_cpp.append(' <ClCompile Include="'+os.path.join(parent,filename)+'" />\n')
filter_cpp.append(' <ClCompile Include="'+os.path.join(parent,filename)+'" >\n' )
filter_cpp.append(' <Filter>'+filterName+'</Filter>\n' )
filter_cpp.append(' </ClCompile>\n' )
continue
if filename.endswith(".h") or filename.endswith(".hpp") or filename.endswith(".hxx") or filename.endswith(".fdf") :
proj_h.append(' <ClInclude Include="'+os.path.join(parent,filename)+'" />\n')
filter_h.append(' <ClInclude Include="'+os.path.join(parent,filename)+'" >\n' )
filter_h.append(' <Filter>'+filterName+'</Filter>\n' )
filter_h.append(' </ClInclude>\n' )
continue
if filename.endswith(".rc") or filename.endswith(".txt") or filename.endswith(".pdf") :
proj_none.append(' <None Include="'+os.path.join(parent,filename)+'" />\n')
filter_none.append(' <None Include="'+os.path.join(parent,filename)+'" >\n' )
filter_none.append(' <Filter>'+filterName+'</Filter>\n' )
filter_none.append(' </None>\n' )
continue
if filename.endswith(".cs") or filename.endswith(".xml")or filename.endswith(".resx") :
proj_none.append(' <None Include="'+os.path.join(parent,filename)+'" />\n')
filter_none.append(' <None Include="'+os.path.join(parent,filename)+'" >\n' )
filter_none.append(' <Filter>'+filterName+'</Filter>\n' )
filter_none.append(' </None>\n' )
continue
fvcproj.write(vcprojFileStrHead1)
fvcproj.write(' <RootNamespace>'+projectname+'</RootNamespace>\n')
fvcproj.write(vcprojFileStrHead2)
fvcproj.write(' <ItemGroup>\n')
for linstr in proj_h:
fvcproj.write(linstr)
fvcproj.write(' </ItemGroup>\n')
fvcproj.write(' <ItemGroup>\n')
for linstr in proj_cpp:
fvcproj.write(linstr)
fvcproj.write(' </ItemGroup>\n')
if len(proj_none)!=0:
fvcproj.write(' <ItemGroup>\n')
for linstr in proj_none:
fvcproj.write(linstr)
fvcproj.write(' </ItemGroup>\n')
fvcproj.write(vcprojFileStrTail)
ffilter.write(filterFilestrHead)
ffilter.write(' <ItemGroup>\n')
for linstr in filter_filter:
ffilter.write(linstr)
ffilter.write(' </ItemGroup>\n')
ffilter.write(' <ItemGroup>\n')
for linstr in filter_h:
ffilter.write(linstr)
ffilter.write(' </ItemGroup>\n')
ffilter.write(' <ItemGroup>\n')
for linstr in filter_cpp:
ffilter.write(linstr)
ffilter.write(' </ItemGroup>\n')
if len(filter_none)!= 0:
ffilter.write(' <ItemGroup>\n')
for linstr in filter_none:
ffilter.write(linstr)
ffilter.write(' </ItemGroup>\n')
ffilter.write(filterFilestrTail)
if __name__ == '__main__':
pass
genPrjOnDir("E:\\testtemp\\prjs","rootmrjwt","prjmrjwt")