织梦CMS - 轻松建站从此开始!

罗索

GCC编译器拒绝内联导致的链接警告

落鹤生 发布于 2014-02-25 20:54 点击:次 
以上错误是因为编译器拒绝将大的函数内联,导致内联函数重复定义;在链接的时候,连接器检查到重复定义后,警告用户废弃重复定义的函数。显示的信息是警告,而不是错误,并且可以正常生成应用程序,这样的警告甚至可以不必理会。
TAG: 编译  编译器  内联  inline  

一个同事来找我,说我写的一个库,在与他的程序链接的时候,链接产生很多错误信息,但是二进制程序还是被顺利编译出来了。

    链接时候出现的错误信息大约是这样:
/usr/bin/ld: `.gnu.linkonce.t._Z17FormatSocketErrori' referenced in section `.gnu.linkonce.r._Z17FormatSocketErrori' of /home/bsmp/AoTainLib/Socket/bin/Socket.a(RawSockSender.o): defined in discarded section `.gnu.linkonce.t._Z17FormatSocketErrori' of /home/bsmp/AoTainLib/Socket/bin/Socket.a(RawSockSender.o)

   我自己也觉得非常奇怪,我在编译和链接中从未出现这样的错误。在网上搜索.gnu.linkonce.这样的信息也有,但是都言之不明。

    反复观察链接的时候产生的错误信息,发现错误都是FormatSocketError这个位置。FormatSocketError()是我写的一个内联 函数,目的是将SOCKET错误码打印为描述性质的字符串。由于这是一个比较通用的函数,所以库中很多地方调用了这个函数。
    错误信息的大概意思是:某位置的FormatSocketError引用了另一位置的FormatSocketError,所以废弃掉了某某某位置的FormatSocketError。
    从这么看来,FormatSocketError被重复定义了很多次。而内联函数是应该被展开的,如果重复定义了,说明编译器没有为我展开。
    想到这里,豁然开朗,于是在库的编译选项里面加上-O2,强制要求将函数内联。

    再去编译应用,正常通过,没有错误信息。

    由此看来,以上错误是因为编译器拒绝将大的函数内联,导致内联函数重复定义;在链接的时候,连接器检查到重复定义后,警告用户废弃重复定义的函数。显示的信息是警告,而不是错误,并且可以正常生成应用程序,这样的警告甚至可以不必理会。

    不过,也仍要小心加上-O2后编译器仍然拒绝内联的情况。所以把大函数定义到CPP中,才是正确的方法。

(ah__fu)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201402/16919.html]
本文出处:百度博客 作者:ah__fu 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容