免费注册 查看新帖 |

Chinaunix

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

[函数] 请教: 库中的函数是如何被link的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-21 11:36 |只看该作者 |倒序浏览
为了说明问题,先假设一个例子:

现在有两个.c文件,分别为main.c和func.c。func.c包含若干个函数(func1,func2 ....)的定义.
main.c中的含有main函数,它要调用func.c中定义的一个函数,比如:
main( )
{
...
func2( );
...
}

为了生成最终的可执行文件test4lib,采用两种方式:

1. gcc -o test4lib main.c func.c

在此种方式下,func.c中定义的所有函数func1,func2...等应该都被包含到最终的可执行文件test4lib中

2. 先用ar将func.o加入到一个库libtest.a,然后
   gcc -static -o test4lib -L./ -ltest

在此种方式下link是怎样进行的.是只将func2包含进test2lib中吗?  

如果上述说法成立,按第一种方式生成的test4lib文件的size应该比第二种方式的大,可我的试验结果却相反!需要说明的是,main函数和func1,func2..函数都没有再调用其他的标准库函数.哪位高手可以解释一下原因? 谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-01-21 11:51 |只看该作者

请教: 库中的函数是如何被link的?

>;>;先用ar将func.o加入到一个库libtest.a,>;>;

libtest.a是什么东东?

论坛徽章:
0
3 [报告]
发表于 2005-01-21 12:00 |只看该作者

请教: 库中的函数是如何被link的?

原帖由 "albcamus" 发表:
>;>;先用ar将func.o加入到一个库libtest.a,>;>;

libtest.a是什么东东?

就是将func.o 加入到一个静态库中,库文件的名字为libtest.a.
地球人都知道阿

论坛徽章:
0
4 [报告]
发表于 2005-01-21 12:10 |只看该作者

请教: 库中的函数是如何被link的?

呵呵,我还以为你得“加入”是插入到一个已经存在的文档库中呢

论坛徽章:
0
5 [报告]
发表于 2005-01-21 12:56 |只看该作者

请教: 库中的函数是如何被link的?

兄弟们,说话啊!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-01-21 13:23 |只看该作者

请教: 库中的函数是如何被link的?

gcc -static -o test4lib -L./ -ltest
你都static了,当然更大了
不用static就是一样大

论坛徽章:
0
7 [报告]
发表于 2005-01-21 13:26 |只看该作者

请教: 库中的函数是如何被link的?

1. gcc -o test4lib main.c func.c 再说这也不是生成库文件啊,明明是可执行文件么。你用ldd test4lib看看,看看有没有连接glibc和ld两个动态库。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-01-21 13:29 |只看该作者

请教: 库中的函数是如何被link的?

他是这样的:
1. gcc -o test4lib main.c func.c 得到一个可执行文件test4lib1
2. gcc -c func.c
ar rv libtest.a func.o
gcc -static -o test4lib main.c -L./ -ltest 得到另一个可执行文件test4lib2
结果test4lib2比test4lib1大

论坛徽章:
0
9 [报告]
发表于 2005-01-21 14:12 |只看该作者

请教: 库中的函数是如何被link的?

原帖由 "yuxh" 发表:
gcc -static -o test4lib -L./ -ltest
你都static了,当然更大了
不用static就是一样大

瞧您这话说的,gcc在link时的默认方式是link动态库.我之所以以static方式进行link是因为gcc -o test4lib main.c func.c 过程中的link也相当于静态的,
只有这样才有意义进行比较。

如果link动态库,按一般的理解,可执行文件应该是最小的了.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-01-21 14:19 |只看该作者

请教: 库中的函数是如何被link的?

你用static编译,把动态库都链到test4lib里来的,文件变大了,有什么不对吗?
libtest.a是个静态库,link一个.a和一个.c是一码事,所以可执行文件应该是一样大。
如果要使可执行文件变小,应该把libtest编译成.so动态库
[quote]原帖由 "nhw_cs"]瞧您这话说的...[/quote 发表:

唉!伤心!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP