在Linux系统下用gcc生成静态库和动态库

一、用gcc生成静态库和动态库

编辑生成例子程序hello.h、hello.c和main.c。
用gedit生成所需要的3个文件
程序1:hello.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H

Alt
程序2:hello.c

#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}

Alt
程序3:main.c

#include "hello.h"
int main()
{
hello("everyone");
return 0;
}

Alt

1、静态库

1.1、将hello.c 编译成.o文件。

Alt

1.2、.o文件创建静态库。

创建静态库用 ar 命令。在系统提示符下键入以下命令将创建静态库文件libmyhello.a。并输入ls命令查看结果。

ar -crv libmyhello.a hello.o

Alt

1.3、在程序中使用静态库。

gcc main.c libmyhello.a -o hello

Alt

我们删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中了。

rm libmyhello.a
./hello
Alt

程序照常运行,静态库中的公用函数已经连接到目标文件中了。

2、动态库

2.1、由.o文件创建动态库文件。

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其
文件扩展名为.so。例如:我们将创建的动态库名为 myhello,则动态库文件名就是libmyhello.so。用 gcc 来创建动态库。在系统提示符下键入以下命令得到动态库文件 libmyhello.so。并使用ls命令查看动态库文件是否生成。

gcc -c -fPIC hello.c
gcc -fpic -shared -o libmyhello.so hello.o
ls
Alt

2.2、在程序中使用动态库。

gcc -o hello main.c -L. -lmyhello
./hello

Alt
出现错误,找不到动态库文件 libmyhello.so。程序在运行时,会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目录/usr/lib 中,再试试。

sudo mv libmyhello.so /usr/lib
./hello
Alt

3、静态库和动态库比较

先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态。

rm -f hello hello.o /usr/lib/libmyhello.so
ls

Alt再来创建静态库文件

gcc -c hello.c
ar -cr libmyhello.a hello.o
gcc -c -fPIC hello.c
gcc -fpic -shared -o libmyhello.so hello.o
ls

Alt
通过上述最后一条 ls 命令,可以发现静态库文件 libmyhello.a 和动态库文件 libmyhello.so 都已经生成,并都在当前目录中。然后,我们运行 gcc 命令来使用函数库 myhello 生成目标文件 hello,并运行程序 hello。
alt
从程序 hello 运行的结果中很容易知道,当静态库和动态库同名时,gcc 命令将优先使用动态库,默认去连/usr/lib 和/lib 等目录中的动态库,将文件 libmyhello.so 复制到目录/usr/lib中即可。

二、静态库.a与.so库文件的生成与使用

编辑生成例子程序A1.c、A2.c、A.h、test.c。
用gedit生成所需要的4个文件。
A1.c:

#include <stdio.h>
void print1(int arg){
printf("A1 print arg:%d\n",arg);
}

alt

A2.c:

#include <stdio.h>
void print2(char *arg){
printf("A2 printf arg:%s\n", arg);
}

alt

A.h:

#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif

alt

test.c:

#include <stdlib.h>
#include "A.h"
int main(){
print1(1);
print2("test");
exit(0);
}

alt

1、静态库.a文件的生成与使用。

1.1、生成目标文件(xxx.o)

gcc -c A1.c A2.c
ls
alt

1.2、生成静态库.a文件

ar crv libafile.a A1.o A2.o
alt

1.3、使用.a库文件,创建可执行程序

gcc -o test test.c libafile.a
./test
alt

2、共享库.so文件的生成与使用

2.1、生成目标文件(xxx.o)

gcc -c -fpic A1.c A2.c
ls
alt

2.2、生成共享库.so文件

gcc -shared *.o -o libsofile.so
ls
alt

2.3、使用.so库文件,创建可执行程序

gcc -o test test.c libsofile.so
./test

alt

发现出现错误,找不到对应的.so文件。这是由于 linux 自身系统设定的相应的设置的原因,即其只在/lib and /usr/lib 下搜索对应的.so 文件,故需将对应 so 文件拷贝到对应路径。

sudo cp libsofile.so /usr/lib
./test

alt
成功运行。

三、改编

编辑生成例子程序sub1.c、sub2.c、sub.h、main.c。
用gedit生成所需要的4个文件。
sub1.c:

float x2x(int a,int b)
{
	float c=0;
	c=a+b;
	return c;
}

alt

sub2.c:

float x2y(int a,int b)
{
	float c=0;
	c=a/b;
	return c;
}

alt

sub.h:

#ifndef SUB_H
#define SUB_H
float x2x(int a,int b);
float x2y(int a,int b);
#endif

alt

main.c:

#include<stdio.h>
#include"sub.h"
void main()
{
	int a,b;
	printf("Please input the value of a:");
	scanf("%d",&a);
	printf("Please input the value of b:");
	scanf("%d",&b);
	printf("a+b=%.2f\n",x2x(a,b));
	printf("a/b=%.2f\n",x2y(a,b));
}

alt

1、静态库.a文件的生成与使用。

1.1、生成目标文件

gcc -c sub1.c sub2.c
ls
alt

1.2、生成静态库.o文件

ar crv libsub.a sub1.o sub2.o

alt

1.3、在程序中使用静态库

gcc -o main main.c libsub.a
./main

alt
我们删除静态库文件试试公用函数main是否真的连接到目标文件main中了。

rm libsub.a
./main

alt
程序照常运行,静态库中的公用函数已经连接到目标文件中了。

2、动态库

2.1、由.o文件创建动态库文件

gcc -c -fpic sub1.c sub2.c
gcc -fpic -shared -o libsub.so sub1.o sub2.o
ls

alt

2.2、在程序中使用动态库

gcc -o main main.c -L. -lsub
./main

alt
出现错误,找不到动态库文件 libsub.so。程序在运行时,会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libsub.so 复制到目录/usr/lib 中,再试试。

sudo mv libsub.so /usr/lib
./main
alt

3、静态库与动态库的生成文件的比较

3.1、静态库

alt

3.2、动态库

alt
通过比较发现静态库要比动态库要小很多,生成的可执行文件大小也存在较小的差别。

四、总结

通过三个程序用gcc生成使用静态库和动态库,基本上可以较为熟练的生成静态库和动态库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值