gcc生成静态库和动态库

gcc生成静态库和动态库,第1张

gcc生成静态库和动态库

用gcc生成.a静态库和.so动态库
    • 一、库
      • 1. 静态链接库
      • 2. 动态链接库
      • 3.二者差异
    • 二、 gcc生成动态库和静态库
      • 1. 用前准备
      • 2. 生成静态库
      • 3. 生成动态库
      • 4. 静动态库的优先调用
    • 三、Linux下静态库和动态库的生成和使用
      • 1. 用前准备
      • 2. 静态库.a文件的生成和使用
      • 3. 共享库.so文件的生成和使用
    • 四、实例使用静动态库
      • 1. 用前准备
      • 2. 静态库的使用
      • 3. 动态库的使用
      • 4. 静动态库生成文件大小的比较
    • 小小的总结
    • 参考文献

一、库

库分为静态链接和库动态链接库,作用相似但又有不同。

1. 静态链接库

静态链接库不同于动态链接库,在静态库情况下,函数和数据被编译进一个二进制文件,编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
linux下的静态链接库是 *.a 文件,与动态链接库 .so 对应。linux下 .a 文件,如果编写了入口函数,也可以直接执行。
Windows下静态链接库是 .lib 文件,与动态链接库 .dll 相对应。

2. 动态链接库

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
动态链接库文件,是一种不可执行的二进制程序文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows 中,DLL 多数情况下是带有 “.dll” 扩展名的文件,但也可能是 ".ocx"或其他扩展名;Linux系统中常常是 “.so” 的文件。它们向运行于 Windows *** 作系统下的程序提供代码、数据或函数。程序可根据 DLL 文件中的指令打开、启用、查询、禁用和关闭驱动程序。

3.二者差异

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

以上库的相关知识取自: Linux系统下利用库生成可执行文件

二、 gcc生成动态库和静态库 1. 用前准备

nano生成例子程序hello.h,hello.c和main.c,此处存于文件夹jingmove(随便取文件名)

分别写入:
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;
}
2. 生成静态库

① 将hello.c编译成.o文件

② 由.o文件创建静态库


③ 在程序中使用静态库

3. 生成动态库

① 由.o文件创建动态库


② 在程序中使用动态库

程序执行时出错,找不到动态库文件,要将动态库文件移动到 usr/lib 目录下。


③ 这时候最后显示权限不够,这时我们应该用命令 su使用管理员权限


④ 但仍然发现多次认证失败,这时候我们用sudo passwd root创建新密码:


⑤ 再重新输入

移动动态库文件到usr/lib目录下,权限不够时,使用命令su到管理员再次移动文件,再执行,多次失败再重新创建密码。


4. 静动态库的优先调用

当静态库和动态库同名时,gcc命令会使用哪个库文件呢?

这时我们先用rm命令删除.c和.h外的所有文件,再来创建libmyhello.a和libmyhello.so文件。

从运行结果可以看见当静态库和动态库重名时,gcc命令优先使用动态库。

三、Linux下静态库和动态库的生成和使用 1. 用前准备

nano生成例子程序y1.c、y2.c、y.h、test.c,此处存于文件夹jingmove2(随便取文件名)


分别写入:
y1.c

#include 
void print1(int arg){
printf("Y1 print arg:%dn",arg);
}

y2.c

#include 
void print2(char *arg){
printf("Y2 printf arg:%sn", arg);
}

y.h

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

test.c

#include 
#include "Y.h"
int main(){
print1(1);
print2("test");
exit(0);
}
2. 静态库.a文件的生成和使用

依次输入图示命令即可成功。

3. 共享库.so文件的生成和使用

依次输入图示命令:

这时出现错误,输入ldd test命令查看链接情况:


找不到对应的.so文件,移动.so文件位置:


成功!

四、实例使用静动态库 1. 用前准备

nano生成例子程序sub1.c、sub2.c、sub.h、main.c,此处存于文件夹jingmove3(随便取文件名)


依次写入
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=%.2fn",x2x(a,b));
	printf("a/b=%.2fn",x2y(a,b));
}
2. 静态库的使用

按图示输入命令即可,注意不要输错字母。


3. 动态库的使用

会出现没有文件或目录的情况,没关系,我们重新生成就行。

4. 静动态库生成文件大小的比较

由输出结果的显示经比较,可以发现静态库文件大小和动态库相比要小得多。

小小的总结

利用库生成可执行文件,第一步都是把要执行的功能的.c生成.o文件,再分别通过命令生成库文件,在linux里,静态链接库是.a文件,动态链接库是.so文件,动态链接库使用还需要放到/usr/lib目录下。

生成静态链接库命令
ar crv libjingtai.a add.o sub1.o

生成动态链接库命令
gcc -shared -fPIC -o libdongtai.so add.o sub1.o

使用的三种方法:

gcc -o jingtai main1.c -I. -ljingtai  #法一
------------------------------------------
gcc main1.c libjingtai.a -o jingtai   #法二
------------------------------------------
gcc -c main1.c
gcc -o jingtai main1.o linjingtai.a   #法三

参考自:原文链接

参考文献
  1. 用gcc生成.a静态库和.so动态库
  2. Linux系统下利用库生成可执行文件

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4662043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存