linux静态链接库、动态链接库

本文介绍C语言中的模块化编程实践,包括如何通过.h和.c文件分离接口与实现,以及三种编译方法:单文件编译、静态链接库和动态链接库的详细步骤与比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序设计思路是,功能接口提供在.h文件中,源代码在.c文件中,应用程序通过包含头文件调用功能api。一个简易的模型如下:

有三个文件:src.h,src.c,main.c,src.h中提供接口声明,src.c中包含源代码实现,main.c是调用接口的模块,内容如下:

src.h:

#ifndef _SRC_H
#define _SRC_H

void print();

#endif

src.c:

#include <stdio.h>

void print()
{
    printf("test\n");
}

main.c:

#include "src.h"

void main()
{
    print();
}

任何大型项目都遵循这样的设计模型,有3种方法实现版本编译:将所有文件一起编译、使用静态链接库、使用动态链接库,项目管理中不会使用第一种方式。

1.将所有文件编译到一起

命令

gcc src.c main.c

得到可执行文件a.out,大小是6698字节,文件顺序无所谓,可以将main.c放在前面

2.使用静态链接库

首先产生src.o文件,即所谓的目标代码,命令如下:

gcc -c src.c

此命令只调用编译器和汇编器,不调用链接器,接下来使用命令:

ar rcs libsrc.a src.o

得到libsrc.a文件,这就是静态链接库,复制到/usr/lib64下,编译命令:

gcc main.c -static -lsrc

产生a.out,大小是762697,明显比第一种方式产生的文件大

3.使用动态链接库

产生libsrc.so文件命令如下:

gcc -shared -fPIC -c src.c
gcc -shared -fPIC -o libsrc.so src.o

将libsrc.so移动到/usr/lib64中,编译命令:

gcc main.c -lsrc

产生a.out,大小是6930字节。

使用ldd命令可以查看可执行文件中动态链接库关系,如下:

ldd a.out 
	linux-vdso.so.1 =>  (0x00007fff949ff000)
	libsrc.so (0x00007fe6c6bde000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fe6c6836000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fe6c6de0000)

编译器有多个查找lib的路径,常用有如下几种:

/usr/lib
/usr/lib64
/lib
/lib64
/usr/local/lib
/usr/local/lib64

只要将so文件放入任何一个路径下即可,在多个路径下有同名so文件的情况下,编译器使用最新的so文件,一个例外是在/etc/ld.so.cache中指定链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值