免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1881 | 回复: 1
打印 上一主题 下一主题

[C++] 可执行程序链接到.o文件和链接到.a文件,行为居然不同 [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-28 13:31 |只看该作者 |倒序浏览
本帖最后由 cdsfiui 于 2016-12-28 13:42 编辑

首先,有两个cpp文件,各自声明了一个类,一个函数,一个类的静态变量。
然后一个main.cpp里面用到了其中一个类文件里面的函数。然后不同的方式链接。
  1. cat First.cpp
  2. #include<stdio.h>
  3. struct First{
  4.   First(){printf("First\n");}
  5. };
  6. void f1(){printf("f1\n");}//没有被main用到
  7. static First f_obj;

  8. $cat Second.cpp
  9. #include<stdio.h>
  10. struct Second{
  11.   Second(){printf("Second\n");}
  12. };
  13. void f2(){printf("f2\n");}//被main用到了
  14. static Second s_obj;

  15. $cat main.cpp
  16. void f2();
  17. int main()
  18. {
  19.   f2();
  20.     return 0;
  21. }

  22. $g++ -c First.cpp  -fPIC
  23. $g++ -c Second.cpp -fPIC
  24. $ar -rvs libmystatic.a  First.o Second.o
  25. $g++ main.cpp -o MylinkSta -lmystatic -L.
  26. $g++ main.cpp -o MyDirect First.o Second.o

  27. $./MylinkSta
  28. Second
  29. f2

  30. $./MyDirect
  31. Second
  32. First
  33. f2
复制代码

可以看到链接了.a版本的程序,没有构造出First对象。
奇怪的是,链接到.a,和链接到产生这个.a文件的两个.o文件,结果居然不同。

如果说,链接.a的时候,没有用到的对象/符号不会加入到最终的二进制文件里面,那么为什么链接两个.o的版本,会去产生First呢? 解释不通。

我尝试了gcc/clang,在ubuntu/rhel上,都是一样的结果。
C++的ABI里面有没有什么坑能导致这个问题? 我尝试了.so的情况,结果和MyDirect一样,也都构造出来了。就是静态库特殊。
求大侠解释解释。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2016-12-28 13:39 |只看该作者
链接库的时候没用到就不把First.o链进去很正常吧,后面你指定要链接进去,那也没错呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP