问题查询

来源:互联网 发布:effective java mobi 编辑:程序博客网 时间:2024/05/06 20:31

DLL 调用错误 -The value of ESP was not properly saved across a function call.       typedef void (* proc)();增加WINAPI后正常:typedef void (WINAPI * proc)();

1.       error LNK2019: unresolved external symbol "void __cdecl _com_issue_error(long)" (?_com_issue_error@@YAXJ@Z) referenced in function "public: __thiscall _variant_t::_variant_t(unsigned short const *)" (??0_variant_t@@QAE@PBG@Z)

链接错误,在加入了comsupp.lib库后解决

2.       error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)

缺少RTTI支持,需要到MSFT网站上下载RTTI支持

http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B830482

下完后加上对应ccrtrtti.lib

#pragma comment(lib , "adsiid.lib")

3. bstr error LNK2019: 无法解析的外部符号 "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)"

解决方法: 加入#pragma comment(lib,"comsupp.lib"),如果任然报错,进行如下设置 在 Visual Studio 开发环境中设置此编译器选项 打开此项目的“属性页”对话框。 单击“C/C++”文件夹。 单击“语言”属性页。 修改“将 wchar_t 视为内置类型”属性。(修改为否)

在VS2005下编译代码,有时会遇到类似如下的警告: warning C4996: 'strcat' was declared deprecated. 通常这类警告都是由于调用了字符串相关函数引起的。虽然这警告无伤大雅,仅仅只是说使用的函数已过时(deprecated)<需要用新的函数来替代>,但看着实在别扭,且看看ms为什么要设置成这样。

    搜索了一下ms的网站,找到了结果。ms认为以前的c/c++库中有一部分函数不够安全,希望程序员可以使用他们的替代安全库(Safe Library)来避免不必要的隐患。 整个原文请点击以下链接访问:Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries

    在网上搜索到的最常用的解决方案,那就是定义 _CRT_SECURE_NO_DEPRECATE _SCL_SECURE_NO_DEPRECATE 来禁止vc2005对此产生警告(依然使用的是非安全库!显然并不是一个好的解决方案)。而且如果使用了ATL,则还需要定义 _ATL_SECURE_NO_DEPRECATE 使用了MFC则需要定义 _AFX_SECURE_NO_DEPRECATE     然而尽管如此,更好的解决方案只需要定义一个宏CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES, 那么VS将会自动替换使用他们的Safe Library来代替C/C++标准库(strcat将被strcat_f来取代)

    即使使用了_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,代码将依旧不够安全, 对此,ms提出了如下10点建议:       1. 不要认为 strcpy_s strncpy_s( 以及其他的字符串函数)(在空间不够的时候)会自动终止拷贝(truncate截断,不截断则意味着溢出).如果需要自动截断,请使用strncpy_s (同时使用_TRUNCATE作为长度参数)       2. 记住fopen_s缺省是独占模式。如需共享使用文件,应该使用_sopen       3. 别忘了_dupenv_s, 它将比_getenv_s更容易使用,因为它能自动分配一个正确长度的内存(buffer)       4. scanf_s中小心参数顺序。       5. 确定printf_s中格式字符串的正确。       6. 使用_countof(x)来取代sizeof(x)/sizeof(element). _countof将会正确的计算元素个数,而且如果x是一个指针,编译器将会发出一个警告(来提醒程序员,仅针对C++编译)       7. 记住所有的sizes(大小,非长度)都是使用characters(字符,unicode下一个字符占2byte)作为单位,而不是bytes(字节).       8. 记住所有的sizes(大小,非长度,缘由同上)包含了字符串结束符'/0'(即别忘了很多情况下size需要+1)       9. 调试的时候监视数据0xfd (在调试版本下)0xfd将会被填充在数据(buffer,通常是字符串)的结尾处。如果运行非你所愿,可能会得到一个长度错误。       10. 检查所有的错误。 许多新函数相比旧函数,能返回(表示)错误信息(的数值)

————————————————————————————————————————————————

     PS:定义宏_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES好像不能消除警告

我的ACE库已经正确安装配置,Samples都可以正常编译运行,但我自己写的程序却出现形如: Linking... tftp.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl ace_os_main_i(class ACE_Main_Base &,int,char * * const)" (__imp_?ace_os_main_i@@YAHAAVACE_Main_Base@@HQAPAD@Z) tftp.obj : error LNK2001: unresolved external symbol "int __cdecl ace_main_i(int,char * * const)" (?ace_main_i@@YAHHQAPAD@Z) Release/tftp.exe : fatal error LNK1120: 2 unresolved externals Error executing link.exe. 的错误,请问怎么解决。最好请大侠详细说一下关于工程的设置问题。

解决办法:

如果有“Cannot open include file: 'ace/SOCK_Acceptor.h': No such file or directory” 工程-设置-C/C++: Preprocessor,附加包含路径:D:/ACE_wrappers 如果有“ You must link against multi-threaded libraries when using ACE (check your project settings)” 工程-设置-C/C++: Code Generation - Use run-time library : Debug Multithreaded Dll 如果有“error C2065: 'ACE_ERROR' : undeclared identifier” error C2065: 'ACE_DEBUG' : undeclared identifier #include "ace/Log_Msg.h" error C4716: 'ace_main_i' : must return a value 在main中加入 return 0; “error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl” 工程-设置-Link-Input: 对象/库模块:添加aced.lib 附加库路径:D:/ACE_wrappers/ace 编译client中遇到的问题 1、error C2039: 'sprintf' : is not a member of 'ACE_OS' #include "ace/OS_NS_stdio.h" 2、error C2039: 'strlen' : is not a member of 'ACE_OS' #include "ace/OS_NS_string.h" 3、error C2059: syntax error : '?' 错误在这一句: ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>/n?)); 将?改为" 4、无法找到动态链接库aced.dll于指定的路径 为系统变量PATH加上D:/ACE_wrappers/bin

原创粉丝点击