社区
C语言
帖子详情
Linux下C程序链接时怎样只把调用到的静态库中的函数链接到可执行程序中?
phyhust
2008-07-16 08:32:17
编译一个C程序,需要用到一个静态库中的某个函数,但我从程序字节大小发现链接后的可执行程序好像把整个静态库都链接进去了,能否只把我程序中调用到的函数链接进去?这样可执行程序就会小点。
...全文
521
16
打赏
收藏
Linux下C程序链接时怎样只把调用到的静态库中的函数链接到可执行程序中?
编译一个C程序,需要用到一个静态库中的某个函数,但我从程序字节大小发现链接后的可执行程序好像把整个静态库都链接进去了,能否只把我程序中调用到的函数链接进去?这样可执行程序就会小点。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的解答!
Linux
程序
设计从入门到实战
《
Linux
程序
设计》主讲:丁宋涛C/C++属于系统级别的编程语言,作为开源软件的代表作品
Linux
操作系统是所有C/C++
程序
员都应当熟悉和掌握的。本门课程从实战出发,降低了初级C/C++
程序
员进入
Linux
程序
设计的门槛。本门课程以Centos为实验环境,从核心命令讲解,再到gcc/gdb开发环境,直至覆盖到460多个常用的类Unix/POSIX API。本课可以有效的节约初学者上手Linxu操作系统的
时
间。同
时
,课程结合GNU的开源代码,仿真实现
Linux
常用命令,展现类Unix系统
调用
的工程级别的实现思路,重点讲解
Linux
环境下的开发和接口
函数
,多线程并发,并最终实现了一个带有CGI功能的小型http服务器。本课程结合计算机
程序
运行原理等内容,增加学员实际编程代码量,提升实战能力。
Linux
下C
调用
静态库
和动态库
本文主要介绍
Linux
下C
调用
静态库
和动态库 1. 概念 动态库和
静态库
二者的不同点在于代码被载入的
时
刻不同。
静态库
的代码在编译过程
中
已经被载入
可执行
程序
,因此体积比较大。动态库(共享库)的代码在
可执行
程序
运行
时
才载入内存,在编译过程
中
仅简单的引用,因此代码体积比较小。 静态情况下,把库直接加载到
程序
中
。而动态库
链接
的
时
候,它只是保留接口,将动态库与
程序
代码独立,这样就可以提高代码的可复用度,和......
linux
下so动态库
调用
主
程序
函数
linux
下动态库 今天无意间发现在
linux
下share object(dynamic library)
中
的
函数
竟然可以不通过回调的方式直接访问主
程序
中
的
函数
,瞬间颠覆以前对于动态库的观念. 1、如代码所示libhi.so
中
有一个
函数
hello, 主
程序
main
中
有一个
函数
hi_out, 那么在main
中
调用
libhi.so
中
的hello
时
,hello会自动找到main
程序
中
的hi_output
函数
地址, 然后进行
调用
. =================hi.c 编译为 libhi.so=...
Linux
下动态库和
静态库
制作与
调用
静态库
是指在应用
中
,有一些公共代码需要反复使用,就把这些代码编译为“库”文件;在
链接
步骤
中
,连接器将从库文件取得所需的代码,复制到生成的可执行文件
中
。这种库称为其特点是可执行文件
中
包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。 动态库又称动态
链接
库英文为DLL,是指DynamicLinkLibrary 的缩写形式,DLL是一个包含可由多个
程序
同
时
使用的代码和数据的库,DLL不是可执行文件。动态
链接
提供了一种方法,使进程可以
调用
不属于其可执行代码的
函数
。...
Linux
下C
调用
静态库
和动态库,
Linux
-C动态库与
静态库
的编译与
调用
Linux
-C动态库与
静态库
的编译与
调用
一、简述记录-
Linux
-C动态库与
静态库
的编译与
调用
。将实现某部分功能的代码封装成库文件,以方便
调用
,或者是对代码进行保护加密。应用场景:有
时
想将某代码提供给别人用,但是又不想公开源代码,这
时
可以将代码封装成库文件。在开发
中
调用
其他人员编写的库。动态库特点:1,库的代码不会编译进
程序
里面,所以动态库编译的
程序
比较小。2,由动态库编译的
程序
依赖于系统的环境变...
C语言
69,373
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章