现在的位置: 首页 > 综合 > 正文

一个visual studio stl有关符号重复定义的问题

2019年04月21日 ⁄ 综合 ⁄ 共 1213字 ⁄ 字号 评论关闭

昨天在visual studio编程遇到很普遍的some variables already defined in some.obj问题,网上对此有很多的讨论,但绝大多数都是由于动态静态链接设置不一致问题,这可以通过改变project properties里面的code generation来解决,比如把/MT改成/MD,这个问题在此不作备忘,网上一查便会有很多解决方案。

而这次的问题无法通过以上方法解决,具体如下: compiler 在link的时候抱怨 “ Error584error LNK2005: "public: unsigned int __thiscall std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>
>,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::size(void)const " (?size@?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@QBEIXZ)
already defined in View.objgeex.lib”

这是因为程序里面使用了vector<string>, 和调用的库geex.lib发生冲突。问题很奇怪,stl的函数名size()怎么会出现冲突呢?而且使用vector<string>的地方没有定义任何全局变量,并且这个问题在release版本下不会发生,而在debug版本则会出现。在网上查了很多,也没有找到解决方法,最后终于发现问题所在,在此记录留作备忘。

问题的原因在于inline function expansion,release为了优化目的,会把像size()这类的短函数展开,而debug版本则不会展开。如果打开生成的View.obj, 在debug版本中会发现size的定义 (?size@?$vector@V?$basic_string@……) 而在release生成的view.obj则没有定义。至今也没搞明白是程序哪里写得不好还是visual studio的bug,因为根据源代码,真是想不出来是怎么冲突的。

解决办法是命令debug下编译器也要对inline函数做展开,只需要在debug对应的工程属性里面的optimization选项,选中Only __inline (/Ob1) 或者 Any Suitable (/Ob2)选项即可(如图)

抱歉!评论已关闭.