Linux系统下利用库生成可执行文件

一、库的定义

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

1.1 动态链接库

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

1.2 静态链接库

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

1.3 不同点

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

二、前置准备

使用动态链接库和使用静态链接库的方法所需的原码都是一样,是编译的过程不一样。这次所用的是sub1.h、sub1.c、add.c、main1.c这几个文件来测试,sub1.c和add.c分别实现一个功能,main1.c是用来测试功能是否实现。
add.c

#include<stdio.h>
float x2y(int a,int b){
    float ans;
    ans=a*b;
    return ans;
}

main1.c

#include"sub1.h"
int main(){
    int x=2,y=9;
    printf("%.2f\n",x2x(x,y));
    printf("%.2f\n",x2y(x,y));
    return 0;
}

sub1.c

#include<stdio.h>
float x2x(int a,int b){
    float ans;
    ans=(float)b/a;
    return ans;
}

sub1.h

#ifndef _SUB1_H
#define _SUB1_H
#include<stdio.h>
float x2x(int a,int b);
float x2y(int a,int b);
#endif

三、使用静态链接库

使用库的前提是要有链接库,而现在却没有链接库,所以第一件事就是生成静态链接库,而生成静态链接库,需要先将需要含有功能的两个文件转化为.o文件才能生成库,所以第一步的命令如下:

gcc -c add.c sub1.c

可以使用ls查看当前文件夹下的文件,如下图
在这里插入图片描述
下一步就是生成库了,命令如下:

ar crv libjingtai.a add.o sub1.o

输出的结果如下图:
在这里插入图片描述
再用ls查看一下,发现多了一个libjingtai.a文件,就是刚刚我们生成的静态链接库
在这里插入图片描述
接下来就是通过库生成可执行文件啦,有三种方法
第一种是下面这种,-o后面就是可执行文件的名字,而-I(大写的i)后面跟的是寻找头文件的目录,-l(小写的L)后面跟的参数就是用来指定的库名,如上面生成的libjingtai.a,库名就是jingtai

gcc -o jingtai main1.c -I. -ljingtai

第二种是把文件名写全

gcc main1.c libjingtai.a -o jingtai

第三种是先生成main1.o文件,再生成可执行文件

gcc -c main1.c
gcc -o jingtai main1.o linjingtai.a

效果都是一样的,执行了可执行文件之后结果如下图
在这里插入图片描述

四、使用动态链接库

动态链接库和静态链接库生成的条件都差不多,都是需要.o文件,只是命令不同和使用方式不同,下面是生成的命令

gcc -shared -fPIC -o libdongtai.so add.o sub1.o

用ls查看可看到已生成
在这里插入图片描述
使用方法和静态库是一致的,名字改一下就行,生成之后运行会出现以下情况
在这里插入图片描述
因为连接的时候用的是当前目录的动态链接库,但运行时是到/usr/lib 找文件,把动态链接库移入就行了,然后再执行一下就可以了
在这里插入图片描述

五、小结

利用库生成可执行文件,第一步都是把要执行的功能的.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

也可以看出动态库和静态库的大小相差蛮大的
在这里插入图片描述

六、参考

静态链接库
动态链接库
gcc -I -L -l的区别

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
freeze是Python的一个第三方,它可以将Python代码和所有依赖项打包成一个可执行文件,使其在Linux系统上独立运行。 在使用freeze前,首先需要在Linux系统上安装好Python和pip工具。然后,使用pip安装freeze,可以通过以下命令完成: ``` pip install freeze ``` 安装完成后,使用freeze将Python代码打包成可执行文件。首先,在项目的根目录下创建一个名为freeze.py的文件,用于编写freeze的设置和命令。在freeze.py文件中,我们可以使用freeze的API来指定需要打包的Python代码和依赖项。 首先,我们需要导入freeze的相关模块: ```python from freeze import freeze from freeze.utils import include_site_packages ``` 然后,指定需要打包的Python代码: ```python freeze(UserCodeFile='your_code.py', Target='your_output_file') ``` 这里的`UserCodeFile`是你的Python代码文件,`Target`是指定生成可执行文件的路径和名称。 如果要包含Python标准和第三方,可以使用`include_site_packages`函数: ```python include_site_packages() ``` 最后,保存并退出freeze.py文件。 接下来,在终端中,进入到freeze.py所在的目录下,通过以下命令运行freeze.py文件: ``` python freeze.py build ``` 这将会生成可执行文件生成可执行文件可以在Linux系统上运行,而无需Python环境和对应的依赖项。可以通过以下命令运行可执行文件: ``` ./your_output_file ``` 其中,`your_output_file`是生成可执行文件的路径和名称。 这样,我们就利用freeze成功将Python代码打包成了在Linux系统上可独立运行的可执行文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值