vs2005使用总结

来源:互联网 发布:网络电视遥控器配对 编辑:程序博客网 时间:2024/05/22 04:27

1、Tools菜单栏下Error Lookup工具,查看系统错误信息;

2、鼠标右击菜单栏的功能

      Refactor(VA X)下的Add Include功能;Implement Virtual Methods...功能

      Go To Definition功能     ALT+G(Go按钮)

      Go To Declaration功能

      Find All Reference功能

3、没有导入lib文件

error LNK2019: unresolved external symbol "__declspec(dllimport) enum SWFRESULT __cdecl SWF_Initialize(char const *,char const *,char const *)" (__imp_?SWF_Initialize@@YA?AW4SWFRESULT@@PBD00@Z) referenced in function "protected: virtual int __thiscall CDLLStorageDlg::OnInitDialog(void)" (?OnInitDialog@CDLLStorageDlg@@MAEHXZ)

4、函数没有实现

error LNK2019: unresolved external symbol "enum SWFRESULT __cdecl SWF_Config_SetValueInt(class ISWFConfig *,char const *,int,int)" (?SWF_Config_SetValueInt@@YA?AW4SWFRESULT@@PAVISWFConfig@@PBDHH@Z) referenced in function "public: void __thiscall CDLLStorageDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CDLLStorageDlg@@QAEXXZ)

5、fatal error C1083: Cannot open precompiled header file: 'Release\swfvmsclt.pch': No such file or directory

工程配置

经常需要设置的项目:

General大选项:

Use of MFC选项

第一个选项中,意思应该是不用MFC类,就是说,如果你选择这项,而且的你的代码中存在MFC类的话,编译应该是不通过的。

第二个选项中,是指静态链接。编译后的程序直接包含了调用MFC的库,这样文件会大一些,但是可以直接转移到其他电脑上运行。它发布时程序不用带MFC的dll。

第三个选项中,是指动态链接。编译后的程序不包含MFC库,所以文件比较小,但是如果把程序直接转移到一个没安装MFC的电脑上,可能会因为找不到MFC的dll而编译不通过。它发布时需要带MFC的dll。

如果可执行文件只有一个,使用后者,执行速度快,但文件比较大。如果可执行文件多个,使用前者,因为DLL文件是共享的,所以文件体积总量减少。单个文件也小。加载执行块,但运行速度略比前者慢。 

 

Character  Set

Use Unicode Character Set使用Unicode编码

Use Multi-Byte Character Set使用Multi-Byte Character编码

DeBugging大选项:

Command:为了对dll工程进行断点调试,此选项设置为加载dll的可执行文件的路径。

C/C++大选项:

General选项

Additional Include Directory:添加文件包含目录

Debug Information Format:

为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。 
为了增加调试信息,可以按照下述步骤进行:
a 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) 
b 选择C/C++页,选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括: 
None: 
没有调试信息 
Line Numbers Only: 
目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息 
C7 Compatible: 
目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型.函数及原型 等 
Program Database: 
创建一个程序库(PDB),包括类型信息和符号调试信息。 
Program Database for Edit and Continue: 
除了上面的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。 
这个选项同时使#pragma设置的优化功能无效 

Code Genetation选项

Runtime Library:

参考文章runtime library介绍 。

Precompiled Headers选项

Create/Use Precompiled Header:

不包含预编译文件的设置时选择Not Using Precompiled Headers,包含预编译文件的设置时选择Create Precompiled Header (/Yc)一般文件名称为stdafx.cpp、Use Precompiled Header (/Yu)其他文件。 有时候提示错误:fatal error C1083: Cannot open precompiled header file: 'Release\swfvmsclt.pch': No such file or directory

Linker大选项:

General选项

Output File:设置文件输出路径

Enable Incremental Linking:将使连接器把调试信息写进可执行文件和DLL。如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译,会生成(.ilk)文件。 

Additional Library Directories:设置lib文件目录

Input选项

Additional Dependencies:添加依赖库

Module Definition File:设置导出def文件

Debugging选项

Generate Program Database File:设置.PDB文件的输出路径。如果C/C++页中设置了Program Database以上的选项,则Generate Program Database File可以选择。

Advanced选项

Import Library:设置(.exp)(.lib)等文件的输出路径。开始为$(Target)$(TargetName).lib修改为$(IntDir)\$(TargetName).lib。

可以通过查看Command Line查看某个大项(例如C/C++)下各个小项的设置。

6、error C2362: initialization of 'a' is skipped by 'goto Flag2'

class A

{

};

int main()

{

goto end1;

int i;

 end1: i=2;

goto end2;

A a;

end2 : i++;

 return 0;

}

第一个goto跳到end1是没有问题的,但是第二个goto跳到end2是不行的。C++标准定义goto不能跳过构造函数的执行。

7、add/remove operation is impossible, because the code element is read only

Visual Studio弹出一个消息框提示:
MESSAGE: Resource Editor: Add/Remove operation is impossible, because the code element ''XXXXXX'' is read only

解决方案是:

Close current project ;

Enter the directory where the project located ;

Delete the .ncb and .suo file  (When I meet this problem, I only delete the .ncb file, and it becomes ok.)

Reopen the project

Then we shall can add new message handler without any issue

 

8、identifier not found redefinition; previous definition was 'formerly unknown identifier'

目录结构:

file1.h内容

file2.h内容

main文件内容

程序通过编译。

当引入头文件的顺序为#include "file2.h"  #include "file1.h"时,提示如下错误:

9、error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'

没有导入头文件string

10、error LNK2019: 无法解析的外部符号

       情况一,没有引入相应的lib库。对于lib库是要链接到exe程序中的,如果在链接的时候,找不到函数对应的符号所在的lib,那就会报error LNK2019: 无法解析的外部符号,有的时候还会提示,在什么地方调用了,如下所示:error LNK2019: 无法解析的外部符号 _XXXXX,该符号在函数 _FFFFF中被引用。解决方法是,将相应的lib加入到工程中编译就可以了。

       情况二,在一个工程中,有很多个子工程,然后,每个工程中都有一些公共的头文件,比如define.h,error.h等,当把这些合到一个工程中编译的时候,可能会把每个子工程的include目录放在附加包含目录中,这样编译的时候就有可能引用了不是它自己的文件,比如:

project/demo1/include

project/demo2/include

在这2个目录下都有error.h,然后在附件包含目录中,包含这2个目录。

而在引用的时候都是这样写:

#include <error.h>

这样在链接的时候,就存在不确定性。可能会出现,demo2引用demo1的error.h的可能。这种情况是不好查的。解决方法是,更改相同的文件名字为每个子工程自己的,让文件名在一个项目中尽量唯一。这个其实也是一个架构和设计的问题。

       情况三,工程是一个目录比如,project/123/123.vcproj,而引用函数的实现目录在project/123/file.cpp,这种情况下也会报error LNK2019: 无法解析的外部符号解决方法是,将project/123目录放到附件包含目录中。

       情况四,工程没有添加相应的.h和.cpp文件。

11、不能断点调试,The source code is different from the original version

修改方法:只需要对次文件 Ctrl+A ,Ctrl+X, 然后再 Ctrl+V就搞定。

12、ibcmtd.lib(dbgheap.obj) : error LNK2005: _malloc already defined

This looks like you're using two different versions of the C run time 
library, often the result of specifying one run-time for your 
executable (e.g. Static Debug) and another for your libraries (e.g. 
DLL Debug Multithreaded).

Make sure that you have the same code generation options for all 
projects. Looking at this it looks like you are linking to the static 
single threaded C RTL (MSVCRT.LIB) and the Multithreaded Debug C RTL 
(libcmtd.lib). That's off the top of my head though, point being that 
those are two separate instances of the RTL and will result in linker 
collisions.

13、error LNK2005 LIBCMTD 与 nafxcwd.lib 冲突 VC

1. 简单解决问题的方式是

找cpp  缺少  #include "stdafx.h" 添加。并且使用 《预编译选项》

B8C9~4S35CKEG12DA5W7_ZJ

 

2.被动解决方式

    又分为2种方式

    1.选择排除 lib 再附加lib   nafxcwd.lib    LIBCMTD.lib  附加的顺序不一样来操作。

    2.另外一种简单的做法 在附加lib处添加  nafxcwd.lib

 

使用  Client.lib 会出现问题,libc 和mfc的库冲突问题。

这边可以在编译时加lib参数 nafxcwd.lib。但是我项目本身不使用mfc。


1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义

1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义

1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 libcpmtd.lib(newaop.obj) 中定义

1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义


MSDN 解决问题链接

http://support.microsoft.com/kb/148652/zh-cn

CRT 库对 newdelete 和 DllMain 函数使用弱外部链接。MFC 库也包含 newdelete 和 DllMain 函数。这些函数要求先链接 MFC 库,然后再链接 CRT 库。

该问题有两种解决方法。第一种方法是强制链接器按照正确的顺序链接库。第二种方法是由您亲自查找导致问题的模块并纠正它。 

注意 以下步骤基于 Visual C++ 6.0。

解决方案一:强制链接器按照正确的顺序链接库
  1. 在“项目”菜单上,单击“设置”。
  2. 在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
  3. 在“链接”选项卡上,单击以选中“类别”组合框中的“输入”。
  4. 在“忽略库”框中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。 
    注意:等效的链接器命令行是:/NOD:<library name>
  5. 在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,而且是行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)。
要在 Visual C++ .NET 中设置该选项,请阅读“设置 Visual C++ 项目属性”联机帮助主题。
解决方案二:查找导致问题的模块并纠正它
若要查看当前的库链接顺序,请按照下列步骤操作:
  1. 在“项目”菜单上,单击“设置”。
  2. 在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。
  3. 在“链接”选项卡上的“项目选项”框中键入 /verbose:lib。
  4. 重新生成项目。在链接过程中,这些库将在输出窗口中列出。


这种现象是设计导致的。

使用 MFC 库时,务必先链接它们,然后再链接 CRT 库。这可以通过确保项目中的每个文件都首先包含 Msdev\Mfc\Include\Afx.h 来完成。

直接包含 (  #include <Afx.h>  ) 或间接包含 (#include <Stdafx.h>) 都可以。Afx.h 包含文件会通过使用 #pragma comment (lib,"<libname>") 指令来强制采用库的正确顺序。 
如果源文件的扩展名为 .c,或者该文件的扩展名为 .cpp 但不使用 MFC,则可以创建一个较小的头文件 (Forcelib.h) 并将其放在模块的顶端。这个新的头文件可确保按照正确的顺序搜索库。 
Visual C++ 不包含该头文件。要创建此文件,请按照下列步骤操作:

  1. 打开 Msdev\Mfc\Include\Afx.h。
  2. 选定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之间的行。
  3. 将选定部分复制到 Windows 剪贴板。
  4. 创建一个新文本文件。
  5. 将剪贴板的内容粘贴到这个新文件中。
  6. 将该文件另存为 Msdev\Mfc\Include\Forcelib.h。


 

原创粉丝点击