• ide basics
  • code snippet
  • Prepreocessor 预处理器
  • 宏展开
  • UNICODE 宏 : 两处设置.
  • vs2005中添加lib文件:
  • cpp 项目被cs项目调用
  • Precompiled headers 预编译头文件
  • libcmt.lib, nodefaultlib:
  • 设置内存更改断点
  • asm/汇编 输出.
  • main 类型自动选择
  • compile as
  • 宏 macros
  • $ 输出路径设置-共三种
  • 资源文件,AssemblyInfo,程序信息,属性
  • 在Visual Studio中彻底禁用IntelliSense
  • intellisense no msgbox
  • 并行项目生成数
  • 生成事件
  • sample
  • 使用内存盘加速链接
  • 编码研究
  • vs build configuration manager
  • external tools
  • lv1=ide lv2=basic type=sum
    ide basics

    code snippet

    在输入了override关键字之后并选择一个方法后,出现这样一个错误提示:Code Snippet titled [Method Override Stub] failed to load.Verify that refactoring snippets are recognized in the Code Snippet Manager and that the snippet files are valid on disk. 
    查了一下,最简单的解决方法是打开Code Snippet Manager(Ctrl+K,B),分别将Program files\Microsoft Visual Studio 8\VC#\Snippets\1033中的Refactoring、Visual C#、OfficeDevelopment三个目录添加进来。原来的同名标签对应的目录都是在2052下的。
    更详细的解释请看:http://www.cnblogs.com/tonyqus/archive/2006/06/29/437928.html

    Prepreocessor 预处理器

    宏展开

    配合正则表达式去掉多余的行 :
    (\n\s*){2,}
    再将展开的部分copy出来,即可独立编译.
    eg:IExample4_with_comment.c
    仍然包含#include<windows.h> #include<objbase.h>
    但无IExample.h
    选择IgnoreStandardIncludePath

    UNICODE 宏 : 两处设置.

    vs2005中添加lib文件:

    #pragma comment(lib,"xx.lib")  
    or:
     VS2005下使用opengl的配置问题
    项目 -->选择属性 C\C++-->preprocessor-->preprocessor definition添加GLUT_BUILDING_LIB,中间用分号隔开,然后点击linker--
    >input--> additional dependencies添加glut32.lib Opengl32.lib Glu32.lib
    还可以在linker->Gerneral--> Additionallibrary Directories中设置路径(eg:$(OutDir))

    cpp 项目被cs项目调用

    common language runtime support, 可以被调试.

    Precompiled headers 预编译头文件

    seestaticDic
    不管在哪层目录,都是#include "pch.h",不要使用"stdafx.h",会出莫名的错误
    STL好像对预编译优化效果不明显,因为需要instantiation
    需要注意被多次#include 的头文件.

    libcmt.lib, nodefaultlib:

    D:\Program Files\Microsoft Visual Studio 8\VC\lib\libcmt.lib
    /NODEFAULTLIB:Libcmt.lib
    /FORCE:MULTIPLE 
    http://www.sciencenet.cn/m/user_content.aspx?id=363348
    参考:
    这个错误是微软设计错误,因此如果遇到这个错误,我们只能躲过这个链接错误。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。MS, C有两种C函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误。因此建议使用支持多线程的msvcrt.lib。
    需要注意的是,当使用其他的库的时候最容易产生这种错误,例如boost和wxWindow使用/MD来编译的,也就是使用支持多线程的C函数库。这时候如果自己的程序没有指明/MD的话,就会提示两种C函数冲突,并且还有LNK2005错误。因此如果使用boost,wxWindow的话,需要指明/MD。
    msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。
    VC中的C运行时库一共有6种
    Single-threaded (libc.lib) libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
    Multithreaded (libcmt.lib) libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
    Multithreaded using DLL (msvcrt.lib) libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
    Debug Single-threaded (libcd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
    Debug Multithreaded (libcmtd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
    Debug Multithreaded using DLL (msvcrtd.lib) libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib
    这个在C++ ->Code Generation-->runtime library 中设置,实际上和静态dll和动态dll有关
    解决办法:
    Project Settings:  
    -> Configration Properties -> Linker -> Input -> Ignore Specific Library: libcmtd
    libcmtd 这个库有时候不能忽略,忽略后会有不能解析的外部符号错误
    其实有个方便的方法 链接时加入参数 /FORCE:MULTIPLE 

    设置内存更改断点

       1.在调试菜单上,选择新建断点,然后单击新建数据断点。
          - 或 -
          在断点窗口菜单中,单击新建,然后选择新建数据断点。
          出现新建断点对话框。
       2.在地址框中,键入内存地址或计算结果为内存地址的表达式。
          例如,键入 &avar,则当变量 avar 的内容更改时中断。
       3.在字节计数框中,键入希望调试器监视的字节数。
       4.单击确定。      例如,如果键入 4,调试器将监视从 &myFunction 开始的四个字节,并在其中有任何字节的值发生更改时中断。

    asm/汇编 输出.

    c/c++ -> 输出文件:

    main 类型自动选择

    compile as

    c/c++ advanced.
    Error	1	error LNK2019: unresolved external symbol "void __cdecl LogMessge(int)" (?LogMessge@@YAXH@Z) referenced in function "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z)	testtest.obj	
    Error	5	error LNK2001: unresolved external symbol _LogMessge	testtest.obj	

    宏 macros

    seebelow
    〖在Visual Studio中彻底禁用IntelliSense〗

    $ 输出路径设置-共三种

    $(SolutionDir)$(ConfigurationName) 改为(cppproj):
    $(SolutionDir)bin
    $(SolutionDir)$(ConfigurationName)
    ConfigurationName:debugorrelease.
    $(OutDir)\$(ProjectName).exe
    $(ConfigurationName) 项目所在路径的debug/release
    c#中的utildll.dllproj如此设置:使其与编译为lib时的输出完全避开.
    链接器的输出路径:
    win32dll.dll
    $(OutDir)\..\FindHelper\bin\$(ConfigurationName)\$(ProjectName).dll

    资源文件,AssemblyInfo,程序信息,属性

    〖AssemblyInfo〗

    在Visual Studio中彻底禁用IntelliSense

    〖C:\Users\Administrator\Documents\visual studio 2008\projects\vsmacros80\Intellisense\Intellisense.vsmacros〗
    http://bybk.pku.edu.cn/user1/coolypf/archives/2009/15098.html
    http://hi.baidu.com/coolypf/item/d12955e7a15affb52f140bfb
    工具-〉宏-〉宏资源管理器,
    在宏资源管理器窗口右击宏结点,选择新建宏项目。
    选择宏项目,命名为Intellisense,然后添加,
    将自动添加的Module1重命名为IntellisenseModule。
    右击IntellisenseModule选择编辑,
    在新窗口中粘贴下面的代码:
    ...
    文件-〉关闭并返回,
    右击Intellisense宏选择设为记录项目。
    工具-〉自定义-〉工具栏-〉新建,
    输入一个你喜欢的名称。
    命令选项卡-〉类别-〉宏,
    将Intellisense开头的五个拖放至刚才新建的工具栏内。
    在按钮上右击可以重命名并更改图标。
    各个按钮的功能:
    Intellisense On 恢复正常状态,开启Intellisense;
    Intellisense Off 绝大多数Intellisense功能关闭,与重命名feacp.dll效果几乎相同;
    Intellisense NoUpdate 禁止Intellisense数据库的自动更新;
    Intellisense Status 显示当前的Intellisense设置状态;
    DeleteNcbAndReload 关闭解决方案,删除ncb文件,重载解决方案。
    注意事项:
    实践证明,NoUpdate比Off选项更好;
    各按钮的修改是永久的,与解决方案无关;
    当没有解决方案载入时,修改是无效的。

    intellisense no msgbox

    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports System.Diagnostics
    Enum ISENSE_FLAGS
        ISENSE_NORMAL = 0       'normal (Intellisense On)
        ISENSE_NOBG = &H1       'no bg parsing (Intellisense Updating Off - although NCB file will be opened r/w and repersisted at shutdown)
        ISENSE_NOQUERY = &H2    'no queries (don't run any ISense queries)
        ISENSE_NCBRO = &H4      'no saving of NCB (must be set before opening NCB, doesn't affect updating or queries, just persisting of NCB)
        ISENSE_OFF = &H7        'no bg parsing, no queries, no saving of NCB, ncb will still be opened, however
    EndEnum
    PublicModule IntellisenseModule
    Sub Intellisense_NoUpdate()
            DTE.Properties("TextEditor", "C/C++ Specific").Item("IntellisenseOptions").Value = ISENSE_FLAGS.ISENSE_NOBG Or ISENSE_FLAGS.ISENSE_NCBRO
    EndSub
    Sub Intellisense_Off()
            DTE.Properties("TextEditor", "C/C++ Specific").Item("IntellisenseOptions").Value = ISENSE_FLAGS.ISENSE_OFF
    EndSub
    Sub Intellisense_On()
            DTE.Properties("TextEditor", "C/C++ Specific").Item("IntellisenseOptions").Value = ISENSE_FLAGS.ISENSE_NORMAL
    EndSub
    Sub Intellisense_Status()
    Dim x
            x = DTE.Properties("TextEditor", "C/C++ Specific").Item("IntellisenseOptions").Value
    Dim result
    If x = ISENSE_FLAGS.ISENSE_NORMAL Then
                result = "Intellisense On"
    ElseIf x = ISENSE_FLAGS.ISENSE_OFF Then
                result = "Intellisense Off"
    Else
    If x And ISENSE_FLAGS.ISENSE_NOBG Then
                    result = "No background parsing. "
    EndIf
    If x And ISENSE_FLAGS.ISENSE_NOQUERY Then
                    result = result + "No Intellisense queries in IDE. "
    EndIf
    If x And ISENSE_FLAGS.ISENSE_NCBRO Then
                    result = result + "No saving of NCB file. "
    EndIf
    EndIf
    MsgBox(result)
    EndSub
    Sub DeleteNcbAndReload()
    Dim name
    Dim namesln
            namesln = DTE.Solution.FullName()
    If Len(namesln) > 4 Then
                name = Left(namesln, Len(namesln) - 4) & ".ncb"
    'If MsgBox("This may take a while. Closing solution, deleting " & name & ", and reopening solution.", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
                DTE.Solution.Close()
                Kill(name)
    'MsgBox("NCB deleted", MsgBoxStyle.OkOnly)
                DTE.Solution.Open(namesln)
    'End If
    Else
                MsgBox("No solution is currently loaded.", MsgBoxStyle.OkOnly)
    EndIf
    EndSub
    EndModule

    并行项目生成数

    生成事件

    〖编译链接消耗时间〗
    包含的文件也可以有属性,设置命令行,在编译时执行.
    vs会进行$(..)的替换;
    生成日志      生成 已启动: 项目: v8_snapshot,配置: Debug|Win32
     命令行      正在创建临时文件F:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\chrome\Debug\obj\v8_snapshot\BAT00004932403168.bat,其内容为
    [
    @echo off
    call "f:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\v8\tools\gyp\..\..\..\third_party\cygwin\setup_env.bat" && set CYGWIN=nontsec&& set INTDIR=F:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\chrome\Debug\obj\v8_snapshot&& set OUTDIR=F:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\chrome\Debug&& bash -c "\"`cygpath -m \"${OUTDIR}\"`/mksnapshot.exe\" \"`cygpath -m \"${INTDIR}\"`/snapshot.cc\""
    if errorlevel 1 goto VCReportError
    goto VCEnd
    :VCReportError
    echo Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "run_mksnapshot"
    exit 1
    :VCEnd
    ]
    正在创建命令行""F:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\chrome\Debug\obj\v8_snapshot\BAT00004932403168.bat""
     输出窗口      run_mksnapshot
    系统找不到指定的路径。
    Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "run_mksnapshot"
     结果      生成日志保存在file://F:\back\ts_simple_v8_2011_07_08-16_31_18_0.1\chrome\Debug\obj\v8_snapshot\BuildLog.htm
    v8_snapshot - 1 个错误,0 个警告
    ---------------------------------
    属性:
    call "$(ProjectDir)..\..\..\third_party\cygwin\setup_env.bat" && set CYGWIN=nontsec&& set INTDIR=$(IntDir)&& set OUTDIR=$(OutDir)&& bash -c "\"`cygpath -m \"${OUTDIR}\"`/mksnapshot.exe\" \"`cygpath -m \"${INTDIR}\"`/snapshot.cc\""

    sample

    [---------------------------------
    set cmdpath=$(SolutionDir)$(ProjectName)PostBuild.cmd
    rem 设置若干变量
    set OUTDIR=$(OutDir)
    if not exist "%cmdpath%" exit /b
    :: or cmd /c "%cmdpath%"
    call "%cmdpath%"
    :: clear err?
    cmd /c
    ---------------------------------
    echo in PostBuild.cmd, some err occurs...
    copy 1 2
    ---------------------------------vs的处理结果
    @echo off
    set cmdpath=X:\project\win32\ExpmtWin32\ExpmtWin32Dll2PostBuild.cmd
    rem 设置若干变量
    set OUTDIR=X:\project\win32\ExpmtWin32\Debug
    if not exist "%cmdpath%" exit /b
    :: or cmd /c "%cmdpath%"
    call "%cmdpath%"
    :: clear err?
    cmd /c
    if errorlevel 1 goto VCReportError
    goto VCEnd
    :VCReportError
    echo Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."
    exit 1
    :VCEnd
    ---------------------------------]

    使用内存盘加速链接

    wke:确保编译之后的libcopy到了内存盘中
    不存在则新建之:
    REM Do not edit from the Visual Studio IDE! Customize via a $(ProjectName)PreBuild.cmd file.
    if not exist "$(ProjectDir)$(ProjectName)PreBuild.cmd" exit /b
    echo --------+++-----------2
    I:\wke\wke_nc\vs2008\WkePreBuild.cmd:
    echo --------BCompare syncing...-----------
    ::don't use "path" for "@%bc%...txt"
    set bc=X:\tools\BC3
    set path=%path%;%bc%
    echo %bc%
    echo %path%
    BCompare "@%bc%\scripts\copy_lib_2_r.txt"
    copy_lib_2_r.txt:
    #sync lib to r:\lib
    load I:\wke\wke_nc\vs2008\Debug_Cairo_CFLite r:\lib
    filter "*.lib"
    sync mirror:left->right

    编码研究

    TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined _tcslenstrlenstrlenwcslen 
    lv1= lv2= type=

    vs build configuration manager

    cs/cpp platform 
    编译参数的最终确定由config|platform最终确定
    但这两者的任意组合不一定有意义
    sln config/platform都可以rename,但project只能rename config,不能rename platform
    sln的config/platform只起到name hint的作用。比如sln指定为debug,但某一project仍然可以指定为release:
    最终,sln的config|platform组合,对应的每个project的config|platform组合,记录在*.sln中。
    debug、release的真正区别在于其配置的具体的编译参数的。如果配置的参数一样,debug、release是没有任何区别的。
    注意,vs界面默认只有config的修改按钮,需通过"Add or Remove Buttons"添加platform的修改按钮。
    最终效果:
    注意,cs的platform最终的配置是在project的build配置项中,因此config manager中看到的不一定准确。。
    lv1=ide lv2= type=

    external tools

    这里的路径会全部被小写
    5.6	在VS中集成git blame