VC的工程设置解读Project—Settings.docx_第1页
VC的工程设置解读Project—Settings.docx_第2页
VC的工程设置解读Project—Settings.docx_第3页
VC的工程设置解读Project—Settings.docx_第4页
VC的工程设置解读Project—Settings.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC的工程设置解读ProjectSettingsVC工程设置可能会直接影响到工程的正确性,有时是BUG产生的直接原因,在出现莫名其妙的错误,首先应考虑到是否是工程设置有问题,这无论对于开发还是测试,都是很必要的,本文大致介绍一下工程设置选项。工程选项的快捷建是Alt+F7, 左边的列表可以选择要设置的工程编译方式(Debug或Release),如果多个工程,还可以选择要设置的工程。右边是一个属性页,内容十分丰富,依次是:General , Debug , C/C+ , Link , Resource , MIDL , Browse Info , Custom Build , Pre-link Step , Post-build step下面主要介绍一下我们常用到的选项:一、General: 设置工程的一般特性,组合框为是否选用MFC静态库,默认为共享的DLL方式,对一些不支持MFC42的机器环境来说,选择静态编译还是有必要的。底下的两个编辑框表示编译中的文件输出路径。二、Debug:设置工程调试的选项。1.Excutable for debug session : 如果是dll的工程,需要指定启动它的exe文件路径,如果是exe工程,默认当前工程。2.Work directory 设置调试程序的工作路径,默认exe当前路径3.Program arguments 程序启动命令行参数,作控制台程序的时候经常要用三、C/C+ : 这一页内容很多,选择项通过Category(种类)来设置,包括:1.General2.Warning leve 警告级别,VC默认为3,一般不更改3.Optimizations优化级别,DEBUG下设为Disable(Debug),就是不优化,在追求效率或者编译结果的时候可以选择最大速度或最小尺寸的选项,不过微软不保证优化的准确性。4.Waring as error : 不用多说了,经常忽略警告的人不会选这项吧?5.Generate browse info : 产生浏览信息,在编辑调试加了一些功能,单会产生很大的编译文件,建议不要选。6.Debug info 选择调试信息的详细程度,在debug情况下,一般选择Program DataBase 或 Program DataBase for Editon and continue 二者区别在于后者可以在调试过程中,修改代码后,部分编译后,在当前环境继续执行,虽然功能很强,建议还是用前者吧。Release一般选择None。7.Preprocessor definitions : 预定义宏8.Code Generation 定义代码产生的规则9.Stuct member aligenment 结构成员对齐,因为CUP为提高效率,有字节对齐的问题,但是如果结构中存在不是整字节的情况,如果在4字节对齐情况下,编译器会自动补齐,如果不希望编译器作这样的工作,选择1字节对齐。四、Link: 设置连接的选项1.Output file name : 输出文件名称,支持相对路径2.Object/library module :工程所需要的lib。默认当前路径。3.Generate debug info : 产生debug信息。Debug默认为true,Release默认为false4.Link incrementally : 增量连接,必须选择Program database选项,提高编译连接的速度5.Enable profiling : 允许程序以profiling启动,可以测试程序的效率等。五、Pre-link Step 连接前的步骤可以在工程连接前,完成一些工作,方式以dos命令行执行,通常拷贝libC+ 调用.lib的方法:一: 隐式的加载时链接,有三种方法1 LIB文件直接加入到工程文件列表中在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中Add Files to Project菜单,在弹出的文件对话框中选中要加入DLL的LIB文件。然后在首先要使用该函数的地方加上该LIB的头文件,如#include .lib.h即可(没有头文件当然就不用了)。2 设置工程的 Project Settings来加载DLL的LIB文件打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件,如you.lib(或者lib文件的路径,包括文件名)。然后在首先要使用该函数的地方加上该LIB的头文件,如#include .lib.h即可(没有头文件当然就不用了)。3 通过程序代码的方式加入预编译指令#pragma comment (lib,*.lib),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。然后在首先要使用该函数的地方加上该LIB的头文件,如#include .lib.h即可(没有头文件当然就不用了)。当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明二, 显式的运行时链接 ,(我用的是此方法)隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。使用GetProcAddress函数得到要调用DLL中的函数的指针。不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。例:在应用程序中调用dll文件在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc创建基于对话框的工程test,并在对话框上放置load按钮,先添加装载代码。1.首先在testdlg.cpp的首部添加变量设置代码:/设置全局变量glibsample用于存储dll句柄HINSTANCE glibsample=null; /如果定义成HANDLE类型,则出错/第二个变量showme是指向dll库中showme()函数的指针typedef int(* Showme)(void);Showme showme;2.利用classwizard为load按钮添加装载dll的代码void ctestdlg:onloadbutton()/要添加的代码如下if(glibsample!=NULL)AfxMessageBox(the sample.dll has already been load.);return;/装载sample.dll,未加路径,将在三个默认路径中寻找 (1)windows的系统目录:windowssystem;/(2)dos中path所指出的任何目录;/(3)程序所在的目录;glibsample=Loadlibrary(sample.dll);/返回dll中showme()函数的地址showme=(Showme)GetProcAddress(glibsample,showme);本文来自CSDN博客,转载请标明出处:http:/file/D:/Study/VC/静态和动态库文件/vc调用dll.mht静态链接库LIB和动态链接库DLL的区别1.什么是静态连接库,什么是动态链接库静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。对于静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:extern C 函数返回类型 函数名(参数表);在调用程序的.cpp源代码文件中如下:#include .lib.h#pragma comment(lib,.debuglibTest.lib)/指定与静态库一起链接第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)对于动态链接库:动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。首先我们必须先注意到DLL内的函数分为两种:(1)DLL 导出函数,可供应用程序调用;(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。visualC+6.0开发工具与调试1、 如何快速地规范代码缩进格式选中所需要规范的代码,按ALT+F82、 如何在Release状态下进行调试ProjectSettingProjectSetting对话框,选择Release状态。C/C+标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database。在Link标签中选中Generate debug info复选框。注:只是一个介乎Debug合Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。3、 Release和Debug有什么不同。Release版称为发行版,Debug版称为调试版。Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件小无法执行调试功能。Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll),比如MFC42.DLL。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C+ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,如MFC42D.DLL。在没有安装Visual C+6.0的机器上不能运行,因为缺MFC42D.DLL等,除非选择use static dll when link。4、 ASSERT和VERIFY有什么区别ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。例如ASSERT(file.Open(strFileName)。一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。5、 Workspace和Project之间是什么样的关系每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting.中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。6、 如何在非MFC程序中使用ClassWizard在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。7、 如何设置断点按F9在当前光标处增加一个断点和取消一个断点。另外,在编辑状态下,按Ctrl+B组合键,弹出断点设置对话框。然后单击【Condition】按钮弹出设置断点条件的对话框进行设置。8、 在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能这似乎是目前这个Visual C+ 6.0版本的一个bug,可按如下步骤使其正常,如再出现,可如法炮制:(1) 关闭Project(2) 删除“工程名.ncb”文件(3) 重新打开工程9、 如何将一个通过ClassWizard生成的类彻底删除首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。10、 如何将再workspace中消失的类找出来打开该类对应的头文件, 然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。11、 如何清楚所有的断点菜单【Edit】【Breakpoints】,打开“Breakpoints”对话框,单击【Remove All】按钮即可。快捷键是“Ctrl + Shift + F8”。12、 如何再ClassWizard中选择未列出的信息打开“ClassWizard”对话框,然后切换到“Class Info”页面。改变“Message filter”,如选择“Window”,“Message”页面就会出现Window的信息。13、 如何检测程序中的括号是否匹配把光标移动到需要检测的括号前面,按快捷键“Ctrl + ”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。14、 如何查看一个宏(或变量、函数)的定义把光标移动到要查看的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单),如果没有建立浏览文件,就会出现提示对话框,按【确定】按钮,然后就会跳到该宏(或变量、函数)定义的地方。15、 如何添加Lib文件到当前工程单击菜单【Project】【Settings】弹出“Project Setting”对话框,切换到“Link”标签页,在“Object/library modules”处输入Lib文件名称,不同的Lib之间用空格格开。16、 如何快速删除项目下的Debug文件夹中临时文件在工作区的FileView视图中选中对应的项目,单击右键弹出菜单,选择【Clean(selection only)】菜单即可。17、 如何快速生成一个现有工程除了工程名外完全相同的新工程。在新建工程的“New”对话框中选择“Custom Appwizard”项,输入新工程的名字,单击【OK】按钮。出现“Custom AppWizard”项,输入新工程的名字,单击【OK】按钮。出现“Custom AppWizardStep 1 of 2”对话框,选择“An existing Project”项,单击【Next】按钮。出现“Custom AppWizardStep 2 of 2”对话框,选择现有工程的工程文件名,最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。现在就可以项用MFC AppWizard一样用这个定制的向导。如果不想用了,可以在Visual C+ 6.0安装目录下CommonMSDev98Template目录中删除该Wizard对应的.awx和.pdb文件。18、 如何解决Visual C+ 6.0不正确连接的问题情景:明明之间改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,有提示重新编译链接一次。这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新“Rebuild All”一次。19、 引起LNK2001的常见错误都有哪些遇到的LNK2001错误主要为:unresolved external symbol “symbol”如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息。一般来说,发生错误的原因有两个:一时所引用的函数、变量不存在,拼写不正确或者使用错误;其次可能使用了不同版本的链接库。一下是可能产生LNK2001错误的原因:由于编码错误导致的LNK2001错误(1) 不相匹配的程序代码或模块定义(.DEF)文件导致LNK2001。例如,如果在C+源文件了内声明了一变量“var1”,却视图在另一个文件内以变量“var1”访问改变量。(2) 如果使用的内联函数是在.cpp文件内定义的,而不是在头文件内定义将导致LNK2001错误。(3) 调用函数是如果所用的参数类型头函数声明是的类型不符将会产生LNK2001错误。(4) 视图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001错误。(5) 要注意函数和变量的可公用性,只有全局变量、函数时可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001错误。澳门新濠天地官网66由于编译和联机的设置而造成的LNK2001错误(1) 如果编译时使用的时/NOD(/NODERAULTLIB)选项,程序所需要的运行库和MFC时将得到又编译器写入目标文件模块,但除非在文件中明确包含这些库名,否则这些库不会北链接进工程文件。这种情况下使用/NOD将导致LNK2001错误(2) 如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时讲的到“unresolved external on ”的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错误。20、 如何调试一个没有源码的exe文件调用的dll在Visual C+ 6.0中,进入“Project Setting”对话框然后选择Debug标签页。通常Visual Studio默认“executable for debug session”为可执行文件名,但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论