VS Tips (Basic part)
Part1:
1. 如何解决Visual C++ 6.0不正确连接的问题
情景:明明改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,又提示重新编译链接一次。
这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新“Rebuild All”一次。
2. 引起LNK2001的常见错误都有哪些
遇到的LNK2001错误主要为:unresolved external symbol “symbol”
如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息。
一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在,拼写不正确或者使用错误;其次可能使用了不同版本的链接库。以下是可能产生LNK2001错误的原因:
<1>由于编码错误导致的LNK2001错误
(1)不相匹配的程序代码或模块定义(.DEF)文件导致LNK2001。例如,如果在C++源文件了内声明了一变量“var1”,却试图在另一个文件内以变量“var1”访问改变量。
(2)如果使用的内联函数是在.cpp文件内定义的,而不是在头文件内定义将导致LNK2001错误。
(3)调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生LNK2001错误。
(4)试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001错误。
(5)要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001错误。
<2>由于编译和联机的设置而造成的LNK2001错误
(1)如果编译时使用的是/NOD(/NODERAULTLIB)选项,程序所需要的运行库和MFC时将得到又编译器写入目标文件模块,但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。这种情况下使用/NOD将导致LNK2001错误
(2)如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时将出现“unresolved external on _WinMain@16”的LNK2001错误信息。
(3)使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func”的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行链接,将在__imp__func上发生LNK2001错误。如果不使用/MD选项编译,在使用MSVCxx.LIB链接时也会发生LNK2001错误。
(4)使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001错误。
(5)当编译调试版的应用程序时,如果采用发行版模态库进行链接也会产生LNK2001错误;同样,使用调试版模态库链接发行版应用程序时也会产生相同的错误。
(6)不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
(7)在不同的模块中使用内联和非内联的编译选项能够导致LNK2001错误。如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),只是将得到错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志为内联函数。
(8)不正确的/SUBSYSTEM或ENTRY设置也能导致LNK2001错误。
3. 如何调试一个没有源码的exe文件调用的dll
在Visual C++ 6.0中,进入“Project Setting”对话框然后选择Debug标签页。通常Visual Studio默认“executable for debug session”为可执行文件名,但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三方的EXE中调用的plug-in程序。
4. Visual C++ 6.0工程中的项目文件都表示什么
.opt:工程关于开发环境的参数文件。如工具条位置等信息。
.aps(AppStudio File)资源辅助文件,二进制格式,一般不用去管它。
.clw:ClassWizard信息文件,实际上是INI文件格式,有兴趣可以研究一下。有时候ClassWizard出了问题,手工修改CLW文件可以解决。如果此文件不存在的话,每次用ClassWizard的时候回提示是否重建。
.dsp(DevelopStudio Project):项目文件,文本格式,不过不熟悉的不要手工修改。
.dsw(DevelopStudio Workspace):是工作区文件,其他特点和.dsp差不多。
.plg:是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件),一般用处不大。在单击菜单【Tool】->【Option】弹出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project):是生成帮助文件的工程,用microsoft Help Compiler可以处理。
.mdp(Microsoft DevStudio Project):是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的.dsp格式。
.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,这样可以加快编译速度。
.map是执行文件的映象信息记录文件,除非对系统底层,这个文件一般用不着。
.pch(Pre-Compiled File):是与编译文件,可以加快编译速度,但是文件非常大。
.pdb(Program Database):记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
.exp:只有在编译DLL的时候才会生成,记录了DLL文件的一些信息,一般也没有用。
.ncb:无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
5.如何将一个通过ClassWizard生成的类彻底删除
首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。
6.如何在Release状态下进行调试
Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database。在Link标签中选中Generate debug info复选框。
注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。
7. Release和Debug有什么不同
Release版称为发行版,Debug版称为调试版。
Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。
Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。
8. ASSERT和VERIFY有什么区别
ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。
例如ASSERT(file.Open(strFileName))。
一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。
9.Workspace和Project之间是什么样的关系
每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting..中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。
Part2:
01. 使用VC开发项目时,常会遇到这种情况:
明明只改动了一个文件,却要把整个项目全部重新编译连接一次。刚刚连接好,一运行,又提示重新编译连接一次,非常讨厌。这是因为出现了未来文件的缘故。
解决方法:找出对应文件夹下的Debug目录,将未来文件全部删除, 再rebuild all一次。(未来文件即其创建和修改时间都比当前系统时间靠后)
02. 有时,Workspace中的ClassView显示混乱。其表现如下:
(1)添加的成员变量或函数不能显示;
(2)即使显示出来了,双击后不能跳至正确的位置。
解决方法:删除 .ncb 文件,再rebuild all。
03. 如何干净的删除一个类?
(1)先从Workspace中的FileView中删除对应的 .h 和 .cpp 文件;
(2)关闭项目,从实际的文件夹中删除对应的 .h 和 .cpp 文件;
(3)删除.clw文件;
(4)打开项目,rebuild all。
04. 直接往工程文件里加入一个 .cpp 文件再编译连接,老提示没有找到预编译头。
解决方法:#include "stdafx.h"
05. 如何向项目中加入自己定义的类?
方法很多,介绍一个简便的:
(1)选择Insert/New Class菜单
(2)弹出对话框,选择Class Type为Generic Class;
(3)输入类名。
当然,也可以自己决定该类的基类
06. 如何在工作区(Workspace)导入多个项目(Project)?
在打开一个项目(*.dsp文件)后,在利用“Project” 菜单下Insert Project into Workspace 子菜单选择另一个项目文件(*.dsp文件),可插入另一个项目。
在 ClassView 视图中,右键可以激活其中某个项目,工作区插入多个项目能方便不同项目间拷贝代码、资源等。
07. 在 ClassView 视图中类太多如何整理?
我们可以在 ClassView 视图中右键新建文件夹(New Folder),再把相近性质的类拖到对应的文件夹中,使整个视图看上去清晰明了。
08. 如何快速删除项目下 Debug 文件夹中临时文件?
在 FileView 视图中选中对应项目,右键Clean即可。
09. 打开一个源文件较大的项目编辑操作非常慢,怎么办?
不要打开项目文件(*.dsp文件),直接打开要编辑的单个源文件(*.h或*.cpp)进行编辑,要快得多。
10. 如果想把整个项目拷贝到软盘,那些文件可以删掉?
除了项目文件夹中Debug文件夹可以删除外,*.ncb, *.opt, *.plg 等文件也可以删除,这些文件Rebuilt all后可以重新生成。
11. 怎样快速生成一个与现有项目除了项目名外完全相同的新项目?
利用File菜单下生成新项目中的Custom AppWizard ,选择 An existing Project ,然后选择现有项目的项目文件名(*.dsp)Finish,编译后就生成一个与现有项目相同但可以重新取名的项目的AppWizard。你可以你用MFC AppWizard一样用它。如果不想用了,可以在 VC 安装目录下Common\MSDev98\Template目录中删除该Wizard中.awx和 .pdb文件。
12. 如何在源文件中定位光标到对称的{ }和 #if, #endif ?
前者使用“Ctrl”+“}” ,后者使用“Ctrl”+“K”。
13. 如何在VC中设置头文件和库文件?
除了VC缺省头文件和库文件外,如果经常要用到第三方的头文件和库文件可以在Tools Options 的Directories中设置。如果只是本项目要用到,可以在Project Setting->Link Object/library Modules中设置库文件。
14. 如果让控制台应用程序支持MFC类库?
可以在控制台应用程序中 include 来引入MFC库,但是控制台应用程序缺省是单线程的,MFC是多线程的,为解决该矛盾,在Project Setting->C/C++ 选项,选择Code Generation,在Use Run-Time Library 下拉框中选择Debug Multithread。
15. 如何为一个MFC应用程序添加ODBC功能?
(1)在文件Stdafx.h文件末尾添加下面一行:
#include <afxdb.h> // MFC ODBC database classes
(2)在文本模式下编辑RC文件(利用File->Open As text 方式)
在下面的程序行(共有两处):
#include "l.chs\afxprint.rc" // printing/print preview resources
添加下面一行:
#include "l.chs\afxdb.rc" // Database resources
16. 数据库表修改后,如何快速更新一个绑定到表的CRecordSet记录集?
利用ClassWizard 中 Member Variables 标签下选中记录集类后,利用 UpdateColoumns 和Bind All。
17. 如何汉化只有可执行代码的.exe 文件?
利用VC Open File 以 Resources 方式打开*.exe 文件,直接修改资源文件,然后保存即可。
18. 文件规格化功能键
源文件在编写完毕时,Visual C++提供Alt+F8功能键,进行文件规格化,常使用该按键可使得文件保持规格化(注,Alt+F8功能键对连续两个CASE语句则会发生处理错误,不能规格化)。
Part 3:
一些小窍门
1) 有时候,你可能在编译的时候,计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因)。当你重启机器后打开刚才的项目,重新进行编译,发现VC会崩掉。你或许以为你的VC编译器坏了,其实不然(你试试编译其它项目,还是好的!),你只要将项目的.ncb、.opt、.aps、.clw文件以及Debug、Release目录下的所有文件都删掉,然后重新编译就行了。
2) 如果你想与别人共享你的源代码项目,但是把整个项目做拷贝又太大。你完全可以删掉以下文件:.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目录下的所有文件。
3) 当你的Workspace中包含多个Project的时候,你可能不能直观地、一眼看出来哪个是当前项目。可以如下设置:Tools->Options->Format,然后在Category中选择Workspace window,改变其默认的字体(比如设成Fixedsys)就行了。
4) 如何给已有的Project改名字?将该Project关掉。然后以文本格式打开.dsp文件,替换原来的Project名字即可。
5) VC6对类成员的智能提示功能很有用,但有时候会失灵。你可以先关掉项目,将.clw和.ncb删掉,然后重新打开项目,点击菜单项View->ClassWizard,在弹出的对话框中按一下“Add All”按钮;重新Rebuild All。应该可以解决问题。
附:
VC文件扩展名解读大全
.APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资源辅助文件。
.BMP:位图资源文件。
.BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。
.CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。
.CNT:用来定义帮助文件中“Contents”的结构。
.CPP或.CXX:用C++语言编写的源代码文件。
.CUR:光标资源文件。
.DEF:模块定义文件,供生成动态链接库时使用。
.DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。
.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。
.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。
.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。
.H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。
.HLP:Windows帮助文件。
.HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。
.HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。
.HPG,生成帮助的文件的工程。
.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。
.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。
.LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件。
.MAK:即MAKE文件,VC4及以前版本使用的工程文件,用来指定如何建立一个工程,VC6把MAK文件转换成DSP文件来处理。
.MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。
.MDP:旧版本的项目文件,相当于.dsp
.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。
.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。
.OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。
.PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。
.PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。
.PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。
.PLG:编译信息文件,编译时的error和warning信息文件。
.RC:资源定义文件。
.RC2:资源定义文件,供一些特殊情况下使用。
.RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。
.SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。
.TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。