linux生成(加载)动态库静态库和加载示例方法

yizhihongxing

生成动态库和静态库的过程可以分为三个步骤:编写源代码、编译生成目标文件、生成动态库或静态库。

编写源代码

首先,我们要编写需要打包成库的源代码。这里,我们假设我们已经编写好了一个简单的C语言用例,其中包含一个函数:

/* test.c */
#include <stdio.h>

int test_func(int a, int b) {
    printf("test_func!\n");
    return a + b;
}

编译生成目标文件

接下来,我们需要编译源代码生成目标文件,同时指定编译方式为生成动态库或静态库。生成动态库的编译方式为-shared,生成静态库的编译方式为-static。下面是两个例子:

生成动态库

gcc -fPIC -shared -o libtest.so test.c

生成的动态库文件为libtest.so。其中,-fPIC表示生成位置无关代码,-shared表示生成动态链接库。

生成静态库

gcc -c test.c
ar -rcs libtest.a test.o

分别使用gcc编译test.c文件,得到test.o文件,然后使用ar命令将test.o文件打包成静态库libtest.a,其中-r表示创建或替换库文件,-c表示新建库文件,-s表示生成符号表。

加载示例方法

加载动态库

加载动态库的方法有两种:一种是使用ldd命令查看当前环境所支持的动态链接库,一种是用dlopen()方法动态加载某一个指定的动态链接库。

使用ldd命令查看动态链接库

ldd ./a.out

这条命令展示了./a.out二进制可执行文件的动态链接库依赖关系。其中,./a.out是可执行文件的路径。

使用dlopen()方法动态加载某一个指定的动态链接库

/* test_dynamic.c */
#include <stdio.h>
#include <dlfcn.h>

int main() {
    void* handle = dlopen("./libtest.so", RTLD_LAZY);
    if (!handle) {
        fprintf(stderr, "%s\n", dlerror());
        return 1;
    }
    dlerror();

    int (*test_func)(int, int);
    *(void **)(&test_func) = dlsym(handle, "test_func");

    char* error = dlerror();
    if (error != NULL)  {
        fprintf(stderr, "%s\n", error);
        return 1;
    }

    int result = test_func(2, 3);
    printf("%d\n", result);
    dlclose(handle);

    return 0;
}

上述代码通过dlopen()方法加载libtest.so库文件,并执行测试函数test_func。

加载静态库

加载静态库的方法是在编译的时候将静态库链接到可执行文件中,这样生成的可执行文件就包含了静态库的代码。下面是一个例子:

gcc -o test_static test.c -L. -ltest

这条命令将test.c文件编译成test_static可执行文件,并且将libtest.a静态库链接到可执行文件中。-L.表示在当前目录查找链接库,-ltest表示链接libtest.a静态库。

总结

通过以上的步骤,我们就可以生成动态库和静态库,并且学会了加载动态库和静态库的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux生成(加载)动态库静态库和加载示例方法 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 自动化工具:win32gui使用方法

    自动化工具win32gui使用方法 Win32gui是Python中的一个第三方库,可以用于Windows 应用程序的自动化操作。Win32gui库使用win32 API的底层功能,可以处理Windows控件、窗口消息等操作。本文将介绍Win32gui的基本用法,帮助初学者快速上手。 Win32gui的安装 在使用 Win32gui 库之前,需要在本地系统上…

    其他 2023年4月16日
    00
  • Android中banner的使用步骤

    当在Android应用中使用横幅(banner)时,可以按照以下步骤进行设置: 添加依赖库:在项目的build.gradle文件中,添加以下依赖库: implementation ‘com.google.android.gms:play-services-ads:20.2.0’ 在布局文件中添加横幅视图:在需要显示横幅的布局文件中,添加以下代码: <c…

    other 2023年8月20日
    00
  • android控件封装 自己封装的dialog控件

    关于Android控件封装和自己封装的Dialog控件,我可以从以下几个方面进行讲解: 为什么要封装控件 控件封装需要考虑的因素 Dialog控件的封装 示例说明 1. 为什么要封装控件 在Android开发中,我们经常会用到系统提供的一些控件,例如TextView、Button、ImageView等等。这些控件封装了Android系统提供的底层API,极大…

    other 2023年6月25日
    00
  • java必学必会之static关键字

    当涉及到Java中的static关键字时,以下是一个完整的攻略,其中包含两个示例说明。 static关键字的概述 在Java中,static关键字用于声明静态成员,即与类相关而不是与实例相关的成员。静态成员属于类本身,而不是类的实例。可以在类的任何地方使用static关键字,包括变量、方法和代码块。 示例1:静态变量 class MyClass { stat…

    other 2023年8月10日
    00
  • Android QQ HD v5.5发布下载 有很大的改进 附下载地址

    Android QQ HD v5.5发布下载攻略 简介 Android QQ HD v5.5是一款经过大幅改进的高清版QQ应用程序。本攻略将详细介绍如何下载和安装该应用程序,并提供两个示例说明。 下载地址 你可以通过以下方式下载Android QQ HD v5.5应用程序: 官方网站:访问QQ官方网站,在下载页面找到Android QQ HD v5.5的下载…

    other 2023年8月4日
    00
  • 鸿蒙 HarmonyOS 3.1 开发者 Beta 版本开启公测招募 首批仅限华为 P50 / Pro

    下面是针对“鸿蒙 HarmonyOS 3.1 开发者 Beta 版本开启公测招募 首批仅限华为 P50 / Pro”的完整攻略: 一、首先了解鸿蒙 HarmonyOS 3.1 鸿蒙 HarmonyOS 3.1 是华为公司推出的新一代分布式操作系统,其最大的特点是可以支持多种设备类型和平台,包括手机、平板电脑、电视、可穿戴设备、智能家居等,可在不同的设备之间进…

    other 2023年6月26日
    00
  • 使用paramiko的sftpget或put整个目录

    以下是关于“使用paramiko的sftp.get或put整个目录”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 Paramiko是用于SSH连接和文件传输的Python库。其中,sftp是Param库中用于文件传输的模块,可以实现文件上传和下载操作。sftp.get和sftp.put是sftp模块中用于下载和上传文件的方法,可以实现单…

    other 2023年5月7日
    00
  • ElementUI嵌套页面及关联增删查改实现示例

    ElementUI嵌套页面及关联增删查改实现示例攻略 1. 简介 在本攻略中,我们将使用ElementUI来实现嵌套页面及关联增删查改的功能。ElementUI是一套基于Vue.js的桌面端组件库,提供了丰富的UI组件和交互效果,方便开发者快速构建Web应用。 2. 准备工作 在开始之前,确保你已经安装了Vue.js和ElementUI,并且已经创建了一个V…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部