【原】开发路上疑难BUG调试记录

时间:2022-11-14 02:26:45

之前遇到棘手的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库,但是在上述操作完成后设置是这样的:

【原】开发路上疑难BUG调试记录

解决方法:

【原】开发路上疑难BUG调试记录

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/机器视觉等领域展开交流!