gcc生成静态库和动态库

目录

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

      (一)使用示例1

      (二)使用示例2

      (三)使用示例3

二、总结

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

静态库和动态库的定义

    静态库

        静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

    动态库

        动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

(一)使用示例1

1.源程序

hello.h

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

hello.c

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

main.c

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

gcc编译

gcc生成静态库和动态库_第1张图片

2.静态库的使用

(1)以.o文件创建静态库

ar -crv libmyhello.a hello.o

  1)创建静态库用 ar 命令。

  2)静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。

gcc生成静态库和动态库_第2张图片

(2)在程序中使用静态库

       1)方法一

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

  自定义的库时,main.c 还可放在-L.和 –lmyhello 之间,但是不能放在它俩之后,否则会提

示 myhello 没定义,但是是系统的库时,就不出错。

gcc生成静态库和动态库_第3张图片

 2)方法二

gcc main.c libmyhello.a -o hello

gcc生成静态库和动态库_第4张图片

 3)方法三

gcc -c main.c 
gcc -o hello main.o libmyhello.a

gcc生成静态库和动态库_第5张图片

(3)验证静态库的特点 

gcc生成静态库和动态库_第6张图片

   在删除静态库的条件下,运行可执行文件,程序照常运行,说明静态库中的公用函数已经连接到目标文件中了。

3.动态库的使用

(1)以.o文件创建动态库

gcc -shared -fPIC -o libmyhello.so hello.o (-o 不可少)

注:shared:表示指定生成动态链接库,不可省略

        -fPIC:表示编译为位置独立的代码,不可省略

gcc生成静态库和动态库_第7张图片

(2)在程序中使用动态库

gcc -o hello main.c -L. -lmyhello
或
gcc main.c libmyhello.so -o hello

  运行程序(./hello)会提示出错,因为虽然连接时用的是当前目录的动态库,但是运行时,是到 /usr/lib 中找库文件的,将文件 libmyhello.so 复制到目录/usr/lib 中即可。

gcc生成静态库和动态库_第8张图片

mv libmyhello.so /usr/lib

我们将文件 libmyhello.so 复制到目录/usr/lib 中,再次进行尝试,程序成功运行。

gcc生成静态库和动态库_第9张图片

 4.静态库与动态库比较

rm -f hello hello.o /usr/lib/libmyhello.so
gcc -c hello.c 
ar -cr libmyhello.a hello.o (或-cvr ) 
gcc -shared -fPIC -o libmyhello.so hello.o
gcc -o hello main.c -L. –lmyhello

先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态;再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so。

注:在删除时,提醒我们权限不够,通过sudo进行删除就好了。下面同理。

gcc生成静态库和动态库_第10张图片

在执行可执行文件,会报一个错误,可见当静态库和动态库同时存在的时候,程序会优先使用动态库。

(二)使用示例2

1.源程序

A1.c

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

A2.c

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

A.h

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

test.c

#include
#include"A.h"
int main()
{
	print1(1);
	print2("test");
	return 0;
}

gcc编译

gcc生成静态库和动态库_第11张图片

 2.程序中使用静态库

ar crv libfile.a A1.o A2.o
gcc -o test test.c libfile.a

gcc生成静态库和动态库_第12张图片

 3.动态库的使用

gcc -shared -fPIC -o libfile.so A1.o A2.o
gcc -o test test.c libfile.so

gcc生成静态库和动态库_第13张图片

(三)使用示例3

1.源程序

sub1.c

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

sub2.c

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

sub.h

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

main.c

#include
#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));
}

gcc编译

gcc生成静态库和动态库_第14张图片

gcc -c sub1.c sub2.c

gcc生成静态库和动态库_第15张图片

 2.静态库

ar crv libsub.a sub1.o sub2.o
gcc -o main main.c libsub.a

gcc生成静态库和动态库_第16张图片

 3.动态库

gcc -shared -fPIC libsub.so sub1.o sub2.o
gcc -o main main.c libsub.so

gcc生成静态库和动态库_第17张图片

4.静态库与动态库生成文件比较

gcc生成静态库和动态库_第18张图片

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

二、总结

  通过实例演示对静态库和动态库的创建和使用,充分了解其建立过程和运行结果,能更好的对知识进行掌握并加深印象,静态库与动态库的让我们对其优先级有了很好的了解,在整体过程中遇到一些问题,通过查询资料并加以改正,最终成功解决,并在此过程中受益良多。

你可能感兴趣的:(ubuntu,linux)