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