之前遇到棘手的BUG总是在处理过后就不管了,导致后面碰到相同问题后重复工作太多。现专门开辟一篇日志以记录接下来一路上比较棘手的“坑”的修复历程:

【C++篇】

1.mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file

说明:由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件
发现这个EXE,DLL正在读写),于是VC就写不进去了,方法是暂时关闭杀毒软件,这样就不用

解决方法:那就是在项目属性——配置属性——链接器——清单文件中, 把生成清单改成否就行了。如果”生成清单“选项为是,则最终会生成exe文件以及.exe.manifest文件

2.error LNK2001: 无法解析的外部符号 解决方法

说明:这个错误非常经常看到,原因是因为项目属性的”依赖项“配置出错。无论你有多确定,一定要重新检查依赖库,或者换个库

解决方法:在项目属性(ALT+F7)->链接器->输入->依赖项中根据出错信息添加必要的.lib库文件。

2.1在实现单例的时候error LNK2001: 无法解析的外部符号 "private: static class Singleton * Singleton::instance" (?instance@Singleton@@0PAV1@A)

原文:

class Singleton
{
public:
static Singleton *GetSingleton()
{
if(instance==NULL) instance=new Singleton();
return instance;
}
~Singleton()
{
cout<<"析构函数"<<endl;
}
private:
Singleton(){};
static Singleton*instance;
};
int main()
{
Singleton*p=Singleton::GetSingleton();
return ;
}

说明:这种情况是因为静态成员instance没有初始化

解决方法:

在cpp文件开始时添加  Singleton* Singleton::instance = NULL

3.fatal error C1189: #error :  WinSock.h has already been included

说明:在开始编译boost::asio库时经常碰到这个错误,这是普遍现象

解决方法:

  1、在包含Windows.h前定义宏WIN32_LEAN_AND_MEAN,就OK了(WIN32_LEAN_AND_MEAN表示不包含一些极少使用和偏门的资料)

  2、在包含Windows.h前包含winsock2.h

  3、在包含Windows.h前包含asio.hpp

  4、项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定义,在其中添加 : WIN32_LEAN_AND_MEAN

4.error C2664: 'log4cplus::PropertyConfigurator::doConfigure' : cannot convert parameter 1 from 'const char [21]' to 'const log4cplus::tstring &'

出错语句:Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("test"));

说明:cannot convert *** from ***往往是由于类型出错,很常见的错误是由于没有加宏导致在不同的平台下不兼容,比如win32编程中的字符串宏_T()、_TEXT()

解决方法:改为PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log4cplus.properties"));

5.error LNK2019: 无法解析的外部符号 _cvReleaseImage,该符号在函数 _main 中被引用

说明:这个错误常见于配置opencv过程中,虽然按照教程配置了,但是仍旧报这个错误。其实只是vs的设置还差一步:将编译平台从win32转换到x64。

解决方法:在配置管理器中:活动解决方案平台->新建->x64

6.error LNK2019: 无法解析的外部符号 __imp_pthread_join,该符号在函数 main 中被引用

说明:跟5的错误是一样的,这是的措施都排查掉后仍旧出现的错误。原因是lib库没配置成功。看一下pthread_joint所在的lib库是什么库,然后用#pragma comment(lib, "sssss.lib");就解决了


【IOS平台篇】

1.

duplicate symbol _OBJC_METACLASS_$_DMSDWebImagePrefetcher in:
/Users/admin/Library/Developer/Xcode/DerivedData/BankFinder-fqgijokhpyhxxycxegilsfupadsm/Build/Intermediates/BankFinder.build/Release-iphoneos/BankFinder.build/Objects-normal/armv7/DMSDWebImagePrefetcher.o
/Users/admin/Desktop/OSChina/BankFinder/BankFinder/3rdLibs/DomobUniversal/libDomobThree.a(DMSDWebImagePrefetcher.o)

说明:出现duplicate symbol错误时不要慌,不外乎两种类型的错误:第三方静态lib文件之间冲突,这时候在错误描述里面会体现出来;第二种是源文件(.h .m)文件之间的冲突,这里包括工程中的源文件之间的冲突以及工程的源文件与lib库中的源文件冲突。此处属于第二种中的后者。

解决方法:根据错误提示,找到相应的文件,比如本处是DMSDWebImagePrefetcher.h(.m)在工程中出现多次,排查并删掉之

2.xcode编译失败,但是无任何出错的信息!不会有红色的编译错误提示!

说明:很奇特的情况,原因是当前的系统时间之后了一天,改回正常的时间就没问题了!

解决方法:修正系统时间

3.no matching function for call to ***(***表示函数名)

说明:从字面上理解很像是函数不存在,但其实是简单的一个错误。这种情况一般发生在oc调用c或者C++时,主要是由函数的参数不匹配引起的!

解决方法:修正函数的参数

4.自定义view,在loadNibNamed这句上始终crash掉,但是不显示异常原因!

说明:这种情况一般是因为xib的outlet连接错误,我这次遇到的错误就是本来outlet链接了一个property,但是后面这个property名称被我改了,但是xib中没有做相应的更改,导致crash。如何确认是否正确呢?在你的自定义xib的view上右键查看所有的outlet,如果有错就会有黄色标志。

解决方法:重新连接outlet

5.cocoaPod设置好PodFile并使用pod update或者pod install下载新的第三方库后,编译代码没问题,在运行时提示“unrecognized selector”错误。

说明:理论上看,所有流程都没问题,头文件也加了,库也加到工程了,command+方法也能正确找到对应头文件,但在运行时却出错。怀疑是工程设置的问题。最后参考SO的文章。去工程设置的Other Linker Flag中检查发现,新添加的库没有出现在里面,也就是说虽然库资源都有了,但是xcode无法加载。

比如,我们期望新增MMPlaceHolder库,但是在上述操作完成后设置是这样的:

解决方法:

6.error is Error Domain=NSURLErrorDomain Code=-1000 "错误的 URL" UserInfo=0x8088e70 {NSUnderlyingError=0x8083680 "错误的 URL", NSLocalizedDescription=错误的 URL

说明:在进行HTTP请求时出现的-1000的错误码,一般来说这个错误码并不是公司或者项目的后台返回来的,而是系统预定义的一种错误类型。原因是url中存在某些非法字符,比如空格以及中文字符。而空格很有可能在http://...的h前面。

因此如果你的代码没有容错能力,没有对url中的空格以及中文字符等非法字符进行检测,那当发送请求时就会出现这个错误。

解决方法:1、检查url是否有空格;2、检查是否含有中文。url中有中文是允许的,但是在发送前必须进行encoding编码(utf8)。而空格是必须要删除掉的

7.dyld: Symbol not found: _OBJC_CLASS_$_xxxxxxxxx

说明:今天遇到一个非常令人费解的崩溃bug,项目代码几年来一直正常运行,但是引入了其他组的某个SDK后在iOS6上崩溃,提示: dyld: Symbol not found: _OBJC_CLASS_$_NSURLSession 但是经过查证,我们的源码以及该SDK都没有使用过NSURLSession这个类。apple文档中说这个类包含在Foundation.framework中,但我们确实没有调用。但是把其他组的这个SDK删掉后又正常。这个问题目前还想不通,但是我们的解决方法如下,其他类似问题也可以按照这种方式解决。

解决方法:在工程设置的Build Phases->Link Binary with Libraries中将xxxxxxx所在的库从required改为optional,比如我遇到的情况就是改Foundation.framework.

8.[[NSBundle mainBundle] pathForResource:]获取到的资源路径一直是nil

说明:相关资源已经通过addTo的方式添加到xcode工程了,已确认非引用,但上述方法一直返回nil。排查后发现是xcode的一个bug,在添加资源时虽然已经是copy添加,但是xcode设置里的"Copy Bundle Resouces"列表中并没有该资源,需要点加号再次添加一次

解决方法:如上

9.XCode在build下是OK的,但是在发包Archive时却提示“library not found for -lpods-SDWebImage”。 怀疑是cocoaPods安装没更新,于是用pod install或者pod update命令重新安装。虽然成功安装,但是提示“

[!] The `WuJieCaoJoke [Debug]` target overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods/Pods.debug.xcconfig'. This can lead to problems with the CocoaPods installation

    - Use the `$(inherited)` flag, or

    - Remove the build settings from the target.”

重新Archive也还是出现library not found错误。

分析:实际上工程是有库的,pod生成的库都放到libPods.a自动添加到工程的build setting中去了。但仍旧找不到。正常情况下pod install是不会有警告的,所有archive通不过与警告应该有关系,可以先解决警告。

解法:根据终端的提示,去build setting中把所有cocoaPods中出现的库名字都删掉,然后加上一行$(inherited)就OK了。

10.XCode的经典"duplicate symbol"

分析:出现这个错误一般是因为build setting的Other Link Flag中添加了-all_load或者-force_load导致的。删除即可。为什么这两个标识会引起duplicate错误呢?all_load的意思是加载所有.a静态库里的文件。假设有A.a和B.a两个静态库,都使用了minizip的代码。使用all_load后工程就会有两份相同的minizip代码,导致错误。所以这两个标识要去掉。以前我们用这两个标识是因为xcode4.2之前链接器有bug,当静态库中只有category时若没有使用all_load则无法识别库里的category。但xcode4.2之后bug修复了。

但是!但是!有时你会发现在other link flag中删掉all_load并没有真的删掉,今天就遇到。列表里明明已经删掉了,但是build setting中仍显示有-all_load。

解法:再次打开列表,删掉第一行的$inherit,bug解决,顺利编译


原创文章,转载请注明 编程小翁@博客园,邮件zilin_weng@163.com,微信Jilon,联系请注明“博客园”。欢迎各位与我在C/C++/Objective-C/机器视觉等领域展开交流!


【原】开发路上疑难BUG调试记录的更多相关文章

  1. geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

    眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...

  2. geotrellis使用(十二)再记录一次惨痛的伪BUG调试经历(数据导入以及读取瓦片)

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG还原 查找BUG 解决方案 总结 后记 一.前 ...

  3. 论 BUG调试与(程序猿)初学者

    作为一枚程序猿,BUG调试是最基本的技能,对于初学者更是重中之重.个人而言,要想为自己的程序猿生涯更上一层楼,就得知道什么是BUG调试,而且还必须知道怎么调好BUG.那么BUG究竟是什么呢?在我之前的 ...

  4. Visual Studio原生开发的20条调试技巧(下)

    我的上篇文章<Vistual Studio原生开发的10个调试技巧>引发了很多人的兴趣,所以我决定跟大家分享更多的调试技巧.接下来你又能看到一些对于原生应用程序的很有帮助的调试技巧(接着上 ...

  5. 一个疑难bug的解决过程

    一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /hom ...

  6. 最难忘的Bug调试经历

    摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...

  7. VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)

    ------------VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)------------- WIN10已上线,随之而来的是VS2015:微软在 "WDK760 ...

  8. Visual Studio 原生开发的10个调试技巧(二)

    原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原 ...

  9. Android开发技术周报183学习记录

    Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了 ...

随机推荐

  1. [Git] Git 常用技巧

    版本对比 1. 对比两个 COMMIT git diff <commit> <commit> 2. 对比 COMMIT 和父 COMMIT git diff <commi ...

  2. python之网络爬虫

    一.演绎自已的北爱 踏上北漂的航班,开始演奏了我自已的北京爱情故事 二.爬虫1 1.网络爬虫的思路 首先:指定一个url,然后打开这个url地址,读其中的内容. 其次:从读取的内容中过滤关键字:这一步 ...

  3. ASP.NET MVC 快速开发框架之 SqlSugar+SyntacticSugar+JQWidgetsSugar+jqwidgets

    jqwidgets.js: 是一个功能完整的框架,它具有专业的可触摸的jQuery插件.主题.输入验证.拖放插件.数据适配器,内置WAI-ARIA(无障碍网页应用)可访问性.国际化和MVVM模式支持. ...

  4. Linux内核知识

    版本 linus树 Linux内核最初创始人--Linus Torvalds管理一个Linus树,linus树也称为主线(mainline).一般指的upstream,"上游",也 ...

  5. 2015年百度之星初赛(1) --- B 找连续数

    找连续数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. JS浏览器全屏

    //全屏 function fullScreen() { var el = document.documentElement; var rfs = el.requestFullScreen || el ...

  7. Ext.NET 4.1 最新版本破解

    Ext.NET 4.1 最新版本破解 今天在将Ext.NET 4.1版本的程序发布到公网时居然要license(localhost和127.0.0.1不收费),而且一年$4999,突然间觉得这是什么鬼 ...

  8. (转载)IO-同步、异步、阻塞、非阻塞

    一.概述 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不 ...

  9. Python基础:模块

    一.概述 二.导入语句 1.基本语法 2.推荐风格 三.模块 1.模块名 2.模块属性 3.可导出的公有属性 4.直接执行 四.包 1.包名 2.包属性 3.可导出的公有属性 4.其他 五.导入原理 ...

  10. SQL compute by 的使用

    SQL compute by 的使用 摘自:http://www.cnblogs.com/Gavinzhao/archive/2010/07/12/1776107.html GROUP BY子句有个缺 ...