探索tinyxml的编译

今天,因为项目的需要,用到了tinyxml的静态库。tinyxml大家都比较熟悉了,编译库的过程也很简单,这里就不详细的赘述了。我按照常规的方法编译成功了相应的x64库之后,将库链接到程序中运行却出现了错误,错误信息如下:

1>xml_settings.obj : error LNK2001: 无法解析的外部符号 "public: __cdecl TiXmlDocument::TiXmlDocument(class std::basic_string,class std::allocator > const &)" (??0TiXmlDocument@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)

虽然说理论上fatal error LINK2001的出错原因有很多,但熟练的程序员因为一般不会轻易犯低级错误,所以极大的概率应该是库出问题了。我仔细阅读了一下错误信息,注意到了“public: __cdecl TiXmlDocument::TiXmlDocument(class std::basic_string,class std::allocator > const &)”,很显然,错误在于TiXmlDocument的一个构造函数未定义,我很奇怪,我编译的库是绝对没有问题的,因为在其他程序中可以正常运行,但是为什么在这里出错?我接着在项目程序中找到了如下的构造方式:

TiXmlDocument mDocument = new TiXmlDocument ( std::string );
再联系出错原因中的“ class std::basic_string”,就很明显了,类似上面的构造函数在库中没有定义。于是我重新打开tinyxml,仔细观察了一下,才发现了原因所在。tinyxml实际上是分为tinyxml和tinyxmlSTL两种的,以前一直没有仔细考虑,直接就忽视了tinyxmlSTL,这次发现,原来类似于上面的使用到了标准模板库(STL)的构造方法等都是在tinyxmlSTL中定义的,而在tinyxml中被一句 #ifdef TIXML_USE_STL 直接忽视掉了,这样如果如果采用tinyxml的库就会出现上面的问题。发现了问题所在,我在前面tinyxml项目中添加了 #define TIXML_USE_STL一句(或者直接编译tinyxmlSTL),重新编译生成,再次链接到项目程序中,本以为能够正常了,却发现虽然原来的问题消除了,但是却出现了下面的问题:

1>tinyXML_STL_x64.lib(tinyxmlparser.obj) : error LNK2001: 无法解析的外部符号 "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)
1>tinyXML_STL_x64.lib(tinyxmlparser.obj) : error LNK2001: 无法解析的外部符号 "public: static class std::locale::id std::ctype::id" (?id@?$ctype@D@std@@2V0locale@2@A)

google了一下,我立刻明白的错误原因,就是库的静态链接和动态链接的问题。照着这个思路,我把tinyxmlSTL的运行库从"多线程(/MT)"改成了“多线程DLL(/MD)",具体的就是”属性→配置→C/C++→代码生成→运行库“,再次编译链接就成功了。

你可能感兴趣的:(探索tinyxml的编译)