JsonCpp 生成的Lib使用时出现unresolved external symbol

来源:互联网 发布:bp算法 链式求导 编辑:程序博客网 时间:2024/06/05 09:13

针对使用生成的Lib时出现unresolved external symbol未解决的外部链接问题

直接上解决方案:


一、不用lib,直接使用JsonCpp的源文件。把头文件和源文件都塞进你的项目里,就可以用了。就和用你自己敲出来的代码一样。


二、 非要用Lib的话,生成的姿势有个特殊要求,要让项目使用预编译头文件也就是stdafx.h,并且在里面include所有的JsonCpp\Inlude头文件。  原理我也没搞明白,大概是namespace的声明原因?

如果还不行,请确定生成时候选的平台和使用Lib的平台选项一样。并确认不是另外两个JsonCpp Lib常见问题(下面有讲) 

熟手自己给项目属性改成使用预编译头文件,然后include一下,其它照常生成就行。



不熟悉的可以完全照着以下步骤来,我自己操作又试了几遍没问题


不要用JsonCpp自带的vs solution,自己用vs开一个win32 console application,type选static library, 预编译头文件precompiled header钩上 ,SDL勾不勾上不知道是否影响,我勾上了。

把JsonCpp的Include文件夹里那些头文件全include进stdafx.h。(至于你是自己拷进项目目录里,然后改一改cpp里面对头文件的引用方式,还是改一下项目的include路径,都行,重点在全都include进stdafx.h)。

把JsonCpp\src\lib_json里的三个cpp文件加进项目。

把那三个cpp文件的最前面都include stdafx.h


设置项目属性 C/C++ 
-> Code Generation -> Runtime Library 应该和使用Lib的项目属性一样。

还有一个容易被忽视的地方,生成的平台X86还是X64,也应该是一样的。

至于Release和Debug试了试不一样似乎没什么所谓。


以防万一有另外一个毛病,最好再设置项目属性C/C++ -> Output Files -> Assembler Output设为 No Listing。


其它项目属性应该没什么要改的,因为我又按照上面的步骤做一遍,不改其他的,没什么毛病。如果还有毛病的话,可以试试把优化全关了。

然后生成吧。生成的Lib应该可以用了。怎么用Lib就不说了。


想看看我的蠢故事可以继续。。下面有故事和网上另外两个JsonCpp Lib使用问题


之前用JsonCpp,用里面自带的vs solution编译出来的lib使用时总是有

unresolved external symbol 链接错误。
好像每次都是

Json::Value的构造函数和什么有毛病。



当时忙着用,干脆不用lib了,直接把头文件和源文件一股脑塞项目里,就可以用了。


现在闲了,准备收拾收拾。



上网查了半天,有许多人遇到这个问题,但是似乎都没解决。


主流的两个对JsonCpp Lib使用问题解决办法也不是针对unresolved
external
symbol链接错误。



附上主流的两个解决方法:


1.  
把生成Lib的项目,和使用Lib的项目,属性的C/C++ 
-> Code Generation -> Runtime Library都设成一样的


这是针对Runtime Library不同问题的解决方法。如果遇到的是这个问题,vs会提示你Lib和当前项目的Runtime Library不一样


我试了试,我的vs会这样报错

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug'


2.

把生成Lib的项目的属性 C/C++ -> Output Files -> Assembler Output设为 No Listing


针对什么错误没注意,有一篇文章提到了,反正不是 未解决的外部链接问题



我用了这两种方法都没有解决 链接错误。


但是有一篇文章提到了如何编译Lib。http://blog.csdn.net/lzm18064126848/article/details/50517062

这篇文章没有用jsonCpp自带的vs solution,而是用vs 的wizard 创建一个static library项目,然后用了预编译头文件,把所有的json文件夹下的头文件都include进stdafx.h这个预编译头文件。


当时我看见这个还偷笑。。不说jsoncpp有配好的solution。单说把所有头文件都include进stdafx.h就好野路子的感觉。。


结果jsoncpp自带的solution生成的Lib总是有未解决的外部链接错误

我自己用vs 的wizard创建静态库项目,但是不用预编译头文件也不行。。。

后来死马当做活马医,按照那篇文章的试了试,加上了预编译头文件,include所有头文件,生成lib,使用。。成了,没有报错。可以运行。可以正常解析和输出json。。。


我服了。。。不知道什么原理



阅读全文
0 0