Linux下动静态库的打包与使用指南(C/C++)

Linux下动静态库的打包与使用指南(C/C++)

什么是库

在软件开发中,我们常常会将一些常用的代码封装成函数或类。如果这些函数或类需要在多个程序中使用,那么将其打包成一个库以供其他程序调用就是一个不错的选择。库分为动态库和静态库两种类型。

静态库和动态库的区别

  • 静态库

静态库是指在程序编译时,代码就已经被编译进了可执行文件中。因此,可执行文件体积较大,但是在程序运行时,不需要加载其他 DLL 文件,直接运行即可。这就保证了程序运行的稳定性。

  • 动态库

与静态库不同,动态库在程序运行时才会被加载。这样,可执行文件不需要包含整个库代码,减小了可执行文件的体积。但是,程序运行时,若是要使用到动态库中的函数代码,就需要先找到动态库所在的位置,然后再去加载其中的函数代码,这样会稍微增加程序启动的时间,但是这样会减少内存的使用,节省硬盘空间。

静态库的打包与使用

静态库打包

静态库可以通过 gcc 命令行进行打包:

$ gcc -c -o mylib.o mylib.c  //这里是将源文件编译为目标文件的语句
$ ar -r libmylib.a mylib.o   //将编译好的目标文件打包成静态库的语句
  • -c 表示编译源文件
  • -o mylib.o 表示将源文件编译为目标文件
  • ar -r 表示将目标文件打包为静态库
  • libmylib.a 表示静态库的名称

静态库使用

静态库使用方法,可以在 gcc 命令行中添加 -lmylib 的参数,其中 -l 表示连接操作(链接器),后面接静态库的名称(去掉前面的"lib"和后面的".a")。例如:

$ gcc -o myapp myapp.c -lmylib

这个命令将会将 myapp.c 编译为目标文件 myapp,并将 myapp 和库中的函数一起连接,生成可执行文件。

动态库的打包与使用

动态库打包

动态库同样可以通过 gcc 命令行进行打包,不过需要特别标注:

$ gcc -fPIC -shared -o libmylib.so mylib.c
  • -fPIC 表示生成与位置无关的代码(PIC)。
  • -shared 表示生成动态库。
  • -o libmylib.so 表示生成的动态库名称。

动态库使用

动态库使用方法类似于静态库的使用,使用 -lmylib 的参数,不过需要加上 -L 和库文件所在目录的路径。

例如,若库文件在 /usr/local/lib 目录下,可以使用下面的命令运行程序:

$ gcc -o myapp myapp.c -L/usr/local/lib -lmylib

实例说明

  • 静态库实例说明

在示例代码中,我们假设存在一个 mylib.c 文件,包含如下代码:

int square(int n) { return n * n; }

使用下面的命令编译 mylib.c 文件并打包生成静态库 libmylib.a:

$ gcc -c -o mylib.o mylib.c
$ ar -r libmylib.a mylib.o

然后,我们可以再编写一个主程序 myapp.c,用来调用 mylib 中的函数:

#include <stdio.h>

int square(int); //声明静态库中的函数

int main(int argc, char *argv[]) {
  int n = 5;
  printf("%d的平方为%d\n", n, square(n)); //调用静态库中的函数
  return 0;
}

最后,使用下面的命令编译 myapp.c 文件:

$ gcc -o myapp myapp.c -L. -lmylib

其中,-L. 表示将当前目录加入到库文件的搜索路径。-lmylib 表示链接到 libmylib.a 静态库文件。

执行 myapp 程序:

$ ./myapp

输出结果为:5的平方为25。

  • 动态库实例说明

继续以 mylib.c 为例。我们可以使用下面的命令编译 mylib.c 文件并生成动态库 libmylib.so:

$ gcc -fPIC -shared -o libmylib.so mylib.c

然后,我们可以再编写一个主程序 myapp.c,用来调用 mylib 中的函数:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

typedef int (*f_type)(int); //声明函数指针类型

int main(int argc, char *argv[]) {
  void *handle;
  char *error;
  int (*f)(int);
  int n = 5;
  handle = dlopen("./libmylib.so", RTLD_LAZY);
  if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(EXIT_FAILURE);
  }
  dlerror();
  f = (f_type)dlsym(handle, "square");
  if ((error = dlerror()) != NULL) {
    fprintf(stderr, "%s\n", error);
    exit(EXIT_FAILURE);
  }
  printf("%d的平方为%d\n", n, (*f)(n));
  dlclose(handle);
  return 0;
}

编译并执行:

$ gcc -o myapp myapp.c -ldl
$ ./myapp

输出结果为:5的平方为25。

这里需要注意一下,使用动态库时,需要使用 dlopen() 函数打开库文件,使用 dlsym() 函数获取指向被调用函数的指针,使用 dlclose() 函数关闭库文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux下动静态库的打包与使用指南(C/C++) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言中如何进行函数定义和调用?

    在C语言中,函数是代码的重要组成部分,有助于提高代码的复用性和可读性。函数定义通常包括函数名、参数和函数体,可以用来完成特定的任务。下面是C语言中如何进行函数定义和调用的详细攻略。 函数定义 C语言中函数定义分为两部分:函数头和函数体。函数头通常包括函数名和参数声明,参数声明可以为空。函数体是实现函数功能的代码块。 下面是一个函数定义的示例: int max…

    C 2023年4月27日
    00
  • 使用C语言实现最小生成树求解的简单方法

    以下是“使用C语言实现最小生成树求解的简单方法”的攻略: 什么是最小生成树? 在一张带有n个结点的带权无向图中,如果选取其中n-1条边可以使得这张图的连通且总权值最小,那么这n-1条边构成的图就是最小生成树。最小生成树在许多实际问题中都有广泛应用,比如设计网络、规划交通和通信等。 最小生成树算法 最小生成树算法有多种实现方法,其中比较常用的有Kruskal算…

    C 2023年5月22日
    00
  • win10运行游戏时出现程序无法正常启动0xc0000142解决方法介绍

    “win10运行游戏时出现程序无法正常启动0xc0000142解决方法介绍” 什么是0xc0000142错误 0xc0000142错误是一种常见的Windows运行时错误,通常在尝试启动游戏或应用程序时出现。它表示软件无法正常启动,这可能是因为操作系统无法正常处理该软件的启动流程,或者软件文件或库缺失。 解决方法 以下是解决0xc0000142错误的方法: …

    C 2023年5月22日
    00
  • C++ 如何判断四个点是否构成正方形

    判断四个点是否构成正方形是一个常见的问题,可以使用数学方法进行判断,也可以利用C++语言编写代码对四个点进行判断。 一、使用数学方法进行判断 如果四个点能构成正方形,那么它们应该满足以下条件: 四个点的四条边相等。 对角线相等。 两条对边之间的角度均为90度。 如果以上条件都满足,则四个点能构成正方形。 二、利用C++语言编写代码进行判断 以下是C++代码示…

    C 2023年5月23日
    00
  • 使用C/C++读写.mat文件的方法详解

    使用C/C++读写.mat文件的方法详解 什么是.mat文件 .mat文件是一种MATLAB的数据格式,即它是MATLAB的数据文件。MATLAB(矩阵实验室)是美国MathWorks公司出品的商业数学软件。它主要用于算法开发、数据可视化、数据分析以及数值计算的统一性处理等。其数据的保存格式是以.mat文件格式进行保存的。 .mat文件的特点 .mat文件因…

    C 2023年5月23日
    00
  • C语言实现商品管理系统开发

    C语言实现商品管理系统开发攻略 介绍 本文将介绍如何使用C语言开发一个简单的商品管理系统。商品管理系统是指一个管理商品库存、添加商品信息、查询商品信息、删除商品信息等简单功能的系统。 步骤 1. 设计数据结构 在编写商品管理系统之前,需要先确定系统所需的数据结构。本系统的数据结构包括商品的名称、价格、库存量等信息。可以使用结构体(struct)来存储这些信息…

    C 2023年5月23日
    00
  • C#如何通过匿名类直接使用访问JSON数据详解

    C#通过匿名类直接使用访问JSON数据非常方便,能够帮助我们更加高效地操作JSON数据。下面是详细的攻略: 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是基于JavaScript语言的一个子集,可以用于表示简单的数据结构,比如数字、字符串、布尔值等等。JSON数据由键值对组成,格式如下: { …

    C 2023年5月23日
    00
  • C语言实现高精度的加法

    接下来我将为您讲解如何使用C语言实现高精度加法的完整攻略: 1. 需求分析 首先,我们需要明确需求:有两个非常大的数需要相加,由于超过了C语言中所能表示的数据范围,因此需要使用“高精度”计算,即手写计算方法,通过逐位计算来实现。 2. 解决方案 实现高精度加法的思路如下: 将两个数用字符数组存储 将两个数的个位数开始逐位相加,大于10则产生进位 将结果按照顺…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部