之前遇到棘手的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. Linux下打开串口设置

    给出打开串口函数 int open_tty(char tty[]) { int fd; char tty_path[32]={0}; sprintf(tty_path,"/dev/%s&qu ...

  2. sqlserver -- 学习笔记(六)日期格式转换

    忘了这篇是从哪里看到,然后复制保存下来,感谢原创的分享~ ) ::08 ),'-',''),' ',''),':','') ),'/','-') ) , ) ) , ) ) , ) ) , ) ) , ...

  3. vs2013update4 vs-mda-remote cordova真机测试ios

    1.升级vs2013到update4 2.下载安装vs_langpack-enu英语语言包 3.下载安装vs2013mda目前版本0.3.1 如果开发andorid,需要android sdk,ant ...

  4. 使用 IntelliJ IDEA 2016和Maven创建Java Web项目的详细步骤及相关问题解决办法

    Maven简介 相对于传统的项目,Maven 下管理和构建的项目真的非常好用和简单,所以这里也强调下,尽量使用此类工具进行项目构建, 它可以管理项目的整个生命周期. 可以通过其命令做所有相关的工作,其 ...

  5. Android学习笔记之树形菜单的应用...

    PS:终于考完试了,总算是解脱了...可以正式上手项目开发了.... 学习内容: 1.掌握如何使用树形菜单...   对知识点进行一下补充...居然忘记了去学习树形菜单...不过在这里补上... Ex ...

  6. js-string字符串对象

    js-string字符串对象 一.String 对象描述 字符串是 JavaScript 的一种基本的数据类型. String 对象的 length 属性声明了该字符串中的字符数. String 类定 ...

  7. 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

    web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...

  8. Java魔法堂:打包知识点之META-INF/MAINFEST.MF

    一.前言     通过执行形如 jar -cvf src.jar src 命令将多个.class文件打包成JAR包时,你会发现JAR包中除了src目录外还多了个MATE-INF/MAINFEST.MF ...

  9. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  10. 自定义动画方法animate

    animate的使用方法:animate(params,speed,callback); 例子:animate({ right: "-=600px",height:"+= ...