头大头大头大头大头大头大头大头大!最近要上传本地的文件到阿里云的oss上,用了阿里提供的sdk,然后正常构建生成静态库,到自个的项目一引用就寄了。先是报无法解析的外部符号,然后好不容易解决了但是切换Release模式引用外部库中的函数又找不到了,报未定义的标识符,但是我明明都添加了头文件路径和引用的库文件和路径!!!!!!!然后就是浪费两天时间网上狂找答案以及找阿里云售后,但是全部没有用(不能说没有用,只是解决方法和我的问题不搭边)。
1.首先是报错无法解析的外部符号LNK2001 和 LNK2019。
排查:①选中项目右击属性,在 ”c/c++ 常规 附加包含目录“ 中是否已经添加引用库的头文件所在目录。
②在 ”链接器 常规 附加库目录“ 中是否已经添加引用库所在的目录。
③在 ”链接器 输入 附加依赖项“ 中是否已经添加的引用的外部库。(只填库文件名就行,当然填全路径也可以,填全路径的话②就可以不用填了)
④用#pragma comment(lib, "xx.lib")在引用第三方库的项目中直接指定编译时要链接的第三方库
如果这个方法能够正常编译调试(反正是测试,不要像我一样写相对路径,建议直接写绝对路径,避免编译器又找不到),那么说明第三方库是没问题的,必须仔细检查项目是否真的能够通过你填写的路径找到静态库,极大概率是①、②、③中的哪一步路径不正确。我是反反复复填了又填改了又改,还是无法解析。把项目中第三方库的代码注释掉又能运行,这个时候就得看看你引用的第三方库是否也有引用了其他的第三方库。如果有,很大概率就是缺少依赖文件了,补上了依赖文件也是不报错了。DeBug模式正常调试,结果一切Release模式问题又来了,直接五百多个报错,但是仔细一看是项目中第三方库的函数没有被找到。为什么Debug没问题Release又有问题呢,我也没有做什么修改啊!!!!!
2.未定义的标识符E0020
报这个错说明是调用了在本文件中没有找到的东西,说明头文件没有包含,但是我明明包含了,而且Debug模式都能正常编译调试了,裂开!然后又各种找,又是一无所获。
排查:①Release模式下也要检查一下配置中附加包含目录、附加库目录、附加依赖项的路径是否有填写。同时引用外部库,可能会生成debug和release两种不同的库文件,不要链接混淆了,同时有dll文件的话要放到release的输出目录下。
②查看头文件包含有没有报错
③查看报错列表是否有头文件无法打开
如果有头文件无法打开,那么报错元凶就算是找到了。但是这些头文件是引用的OssClient.h中包含的头文件,和我没有直接关系才对啊,在OssClient.h所在的目录里也有这些头文件,这为啥还会报错???于是我打开这些头文件一看,嚯!这些头文件里包含的头文件也找不到,离了大谱了。于是我就把引用库的代码全部注释掉仅包含引用的OssClient.h,再次编译还是一样,那么已经很明显了,报错的原因就是这些被OssClient.h包含的头文件没有被找到。然后我发现这些头文件的包含是带路径的,那么最终的原因就水落石出了:我引用的头文件是#include "Include\alibabacloud\oss\OssClient.h",附加包含目录填的是 ”E:winclient\SyncBoxDll\Include\alibabacloud\oss“,而OssClient.h中这些报错的头文件实际上和OssClient.h是同级目录,但是在OssClient.h中引用时并不是同级,所以才会导致OssClient.h中引用的头文件找不到,导致报错!!!!!!于是我就包含头文件的路径改为 ”E:winclient\SyncBoxDll\Include“,OK完美解决!!!!!!
虽然这种问题的没有什么技术含量可言,但是真要遇上了排查起来是真麻烦,同样的报错网上各种五花八门的答案,但是不一定对症。希望能对遇上同样问题的朋友有帮助。最后想问一下懂的大佬,既然是这个路径问题,那为什么debug不会报错,release会报错啊!!!就因为release优化的原因吗?