栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用gcc生成静态库和动态库文件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用gcc生成静态库和动态库文件

目录

一、了解静态库及动态库

二、链接静态库编译

1、编写源程序

2、静态文件库libx2.a的编译

1)编译.o目标文件

2)编译libx2.a静态库文件

3、链接为可执行文件main 

三、编译时链接动态库文件

1、编译动态库文件libx2.so

2、链接为可执行文件

四、心得体会

 五 、参考文献


一、了解静态库及动态库

函数库分为静态库和动态库两种。

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

二、链接静态库编译

1、编写源程序

main.c(主函数):

#include"sub1.h"
#include"sub2.h"
#include

int main()
{
	int x=2,y=9,n;		//定义x和y变量
	printf("%d/%d=%.2fn",y,x,x2x(x,y));	//输出处理后的值,保留两位小数
	printf("请输入斐波那契的第n项值:");
	scanf("%d",&n);
	printf("斐波那契数列第%d项为%dn",n,x2y(n));	//输出斐波那契数列的第n项
	return 0;
}

sub1.h

#ifndef __SUB1_H
#define __SUB1_H

float x2x(int a,int b);		//计算b除以a

#endif

sub1.c

#include "sub1.h"
float x2x(int a,int b)
{
	float ans;
	ans=(float)b/a;
	return ans;
}

sub2.h

#ifndef __SUB2_H
#define __SUB2_H

int x2y(int);	//计算斐波那契数列的第n项值

#endif

sub2.c

#include "sub2.h"
int x2y(int n)
{
	int a=1,b=1,i;
	long c=0;
	if(n<3) return 1;
	else
	{
		for(i=0;i<=n-3;i++)
		{
			c=a+b;
			a=b;
			b=c;
		}
		return c;
	}
}

2、静态文件库libx2.a的编译

1)编译.o目标文件


输入以下命令

gcc -c main.c sub1.c sub2.c

 

可以编译得到main.o、sub1.o、sub2.o三个目标文件

2)编译libx2.a静态库文件


使用如下命令编译生成libx2.a静态库文件。

ar -crv libx2.a sub1.o sub2.o

3、链接为可执行文件main 

使用下面的命令链接main.o和libx2.a文件生成可执行文件main

gcc main.o libx2.a -o main

 

 使用下面的命令执行该可执行文件:

./main

 

 

测试是否真的静态库链接成功,删除静态库libx2.a目标文件,再次执行该可执行文件 :

以上说明静态库链接生成的可执行文件运行时不需要该静态库,因为该静态库已经被编译到可执行文件中了。

三、编译时链接动态库文件

1、编译动态库文件libx2.so

.o目标文件已经在上面编译静态库文件时生成了,因此这里直接编译动态库文件。
使用下面的命令编译生成动态库文件libx2.so

gcc -shared -fPIC -o libx2.so sub1.o sub2.o

 

2、链接为可执行文件

输入如下命令:

sudo mv libx2.so /usr/lib

程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行,所以如果不输入上述指令程序将会报错!!!

再输入如下命令链接两个目标文件生成可执行文件main

gcc main.o libx2.so -o main

 

 

 使用下面的命令查看main可执行文件的依赖项:

ldd main

 

四、心得体会

       通过操作,让我对库有了进一步的理解:动态库生成的可执行文件要比静态库生成的要更小,但是链接动态库需要依赖于该动态库以及静态库链接是直接在程序编译时就将其组装到一起,可以不依赖于静态库就能运行。而动态库链接是在程序运行时才将其载入内存运行且不能够缺少,否则不能运行。

 五 、参考文献

gcc分别链接静态库和动态库生成可执行文件_不#曾&轻听的博客-CSDN博客

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号