Linux下C程序链接时怎样只把调用到的静态库中的函数链接到可执行程序中?

phyhust 2008-07-16 08:32:17
编译一个C程序,需要用到一个静态库中的某个函数,但我从程序字节大小发现链接后的可执行程序好像把整个静态库都链接进去了,能否只把我程序中调用到的函数链接进去?这样可执行程序就会小点。
...全文
521 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Darkneece 2008-07-17
  • 打赏
  • 举报
回复
1、ar只是把.o文件“打包”成了一个.a文件,像tar一样,里面还是数个.o,编译时只是装的需要的那个.o
2、函数依赖哪个.o就会链接哪个.o
2者我觉得没区别
phyhust 2008-07-17
  • 打赏
  • 举报
回复
ok,谢谢levinee的解答!
那我有个疑问,(1)用函数库的*.o做成一个静态库libz.a,然后用应用程序*.o与libz.a链接生成可执行程序,(2)直接用应用程序*.o与函数库的*.o链接生成可执行程序,用方法(1)和方法(2)生成的可执行程序有何区别?区别是否在于方法1生成的程序只把需要的库函数装入可执行程序,而方法2把所有的库函数都装入可执行程序了?
levinee 2008-07-17
  • 打赏
  • 举报
回复
cc -o test2 test.o lt.o lt2.o //直接用*.o链接
这里test2中没有用到it2.o.但被链接到可执行文件中.
如果你这么写Makefile的话,从某种意义上算一种错误.
phyhust 2008-07-17
  • 打赏
  • 举报
回复
to Darkneece:试验结果表明,二者好像不一样
/* lt.h
*
*/
void myprint(void);

/* lt.c
*
*/

#include <stdio.h>

void myprint(void)
{
printf("Linux library test!\n");
}

/* lt2.h
*
*/
void myprint2(void);

/* lt2.c
*
*/

#include <stdio.h>

void myprint2(void)
{
printf("Linux library test!\n");
}
/* test.c
*
*/

#include "lt.h"

int main(void)
{
myprint();
return 0;
}
用上面几个文件编译了三个文件lt.o、lt2.o test.o
ar cqs liblt2.a lt.o lt2.o //编译静态库
cc -o test test.o liblt2.a //用静态库链接
cc -o test2 test.o lt.o lt2.o //直接用*.o链接
得到的test文件和test2文件大小不一样,test2文件大一些

结论:
1、用静态库编译时只是装的需要的那个.o
2、用*.o链接时,不管主程序用没用到那个o,都装进可执行程序了
2者还是区别
mymtom 2008-07-16
  • 打赏
  • 举报
回复
一般来说静态库的链接是以编译单元(目标文件.o)为单位的, 调用到函数所在的.o会被链接进执行文件。
所以很多库的设计都是尽量一个函数一个文件,当然这要求低耦合的设计。
楼主的程序又是在嵌入设备上跑,更应该注意这个。
可以参考一下bsd的libc设计。
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/
phyhust 2008-07-16
  • 打赏
  • 举报
回复
哪位大侠知道的帮帮忙
leehq 2008-07-16
  • 打赏
  • 举报
回复
只有自己编译一个小的...
levinee 2008-07-16
  • 打赏
  • 举报
回复
不会把整个库都静态链接到可执行程序中的.
请参照《c专家编程》第一版p94
"即使是在静态链接中,整个libc.a文件也并没有被全部装入到可执行文件中,所装入的只是所需要的函数"
phyhust 2008-07-16
  • 打赏
  • 举报
回复
To iambic: 这是在嵌入式系统上跑的程序,当然越小越好拉
phyhust 2008-07-16
  • 打赏
  • 举报
回复
静态库的源代码我有,但是文件数比较多,调用关系复杂,不可能把我要用的函数给抠出来吧?大侠有没有什么办法减少可执行程序的大小呢?
iambic 2008-07-16
  • 打赏
  • 举报
回复
没人差那么点硬盘。
lala_benben 2008-07-16
  • 打赏
  • 举报
回复
....你所说的只加载一个函数貌似不太可能。。静态库只要被调用,就会全部拷贝过来
phyhust 2008-07-16
  • 打赏
  • 举报
回复
我想在我的程序中用压缩算法进行数据压缩,找到一个库zlib的源码,按照说明编译了好多*.o,然后用这些*.o做了一个静态库libz.a,大概有78k,我的程序用到其中一个压缩函数,在链接的时候将此libz.a静态库链接进来,程序就比不用压缩算法时候增大了几十k,我现在的问题是只想把我程序用到的库中的函数链接进来,而不希望为了这个压缩函数而把整个库都链接到程序中,有没有什么高招?
充电宝111 2008-07-16
  • 打赏
  • 举报
回复
一般静态库最好一个文件放一个函数,动态库就无所谓了
充电宝111 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mymtom 的回复:]
一般来说静态库的链接是以编译单元(目标文件.o)为单位的, 调用到函数所在的.o会被链接进执行文件。
所以很多库的设计都是尽量一个函数一个文件,当然这要求低耦合的设计。
楼主的程序又是在嵌入设备上跑,更应该注意这个。
可以参考一下bsd的libc设计。
http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/
[/Quote]
phyhust 2008-07-16
  • 打赏
  • 举报
回复
谢谢mymtom的解答!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧