动态库和静态库的区别(动态库与静态库的区别)

动态库和静态库的区别(动态库与静态库的区别)nbsp 上方 机械电子工程技术 关注我们 在 Linux 系统编程中 静态库 Static Library 是一种编译后的代码库 它包含了多个编译单 比如函数和数据 的集合 这些编译单可以被多个程序共享 静态库通常以 a 为文件后缀 编译源文件 首先 你需要编写源代码并将其编译成目标文件 Object Files 通常以 o 为后缀 gcc c source file c 这里 c 选项告诉编译器只编译源文件 不进行链接 创建静态库 使用 ar



点击上方“机械电子工程技术”关注我们





在Linux系统编程中,静态库(Static Library)是一种编译后的代码库,它包含了多个编译单元(比如函数和数据)的集合,这些编译单元可以被多个程序共享。静态库通常以.a为文件后缀。
编译源文件:首先,你需要编写源代码并将其编译成目标文件(Object Files),通常以.o为后缀。
gcc -c source_file.c
这里-c选项告诉编译器只编译源文件,不进行链接。
创建静态库:使用ar工具将所有目标文件打包成一个静态库。
ar rcs liblibrary_name.a object_file1.o object_file2.o ...
    • r:插入文件,如果静态库不存在则创建。

    • c:在创建或插入文件时不进行警告。

    • s:创建索引,用于从库中读取单个文件。

编译时链接:在编译程序时,你需要指定静态库的路径和要使用的库中的对象文件。
gcc program.c -L/path/to/library -llibrary_name -o program

    -L:指定静态库的搜索路径。

    -l:指定要链接的库,不要加前缀lib和后缀.a

gcc program.c -L/path/to/library -l:object_file_name.o -o program
设置运行时库路径:如果静态库中包含的代码依赖于特定的库文件,你可能还需要在运行时设置LD_LIBRARY_PATH环境变量,以便程序能找到这些库。
export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
  • 静态库在编译时被整合到最终的可执行文件中,因此可执行文件的大小会增大。

  • 静态库中的代码在编译时被复制到可执行文件中,因此如果多个程序使用同一个静态库,那么每个程序都会包含一份代码的副本,这可能会导致内存浪费。

  • 使用静态库的程序在运行时不需要静态库文件,因为所有需要的代码都已经包含在可执行文件中了。

通过一个简单的例子来说明静态库的制作与使用:

假设我们有一个简单的数学库,它提供两个函数:add 和 multiply。
编写源代码:首先,我们创建两个源文件 add.cmultiply.c

add.c:

int add(int a, int b) {    return a + b;}

multiply.c:

int multiply(int a, int b) {    return a * b;}
编译源文件:使用 gcc 编译这些源文件生成目标文件。
gcc -c add.c -o add.ogcc -c multiply.c -o multiply.o


创建静态库:使用 ar 工具将目标文件打包成静态库。
ar rcs libmath.a add.o multiply.o
这里,libmath.a 是我们创建的静态库的名称。
现在,我们创建一个程序 main.c,它使用我们的数学库。
编写使用库的程序main.c 使用 addmultiply 函数。

main.c:

#include <stdio.h>
int add(int, int);int multiply(int, int);
int main() { int sum = add(3, 4); int product = multiply(3, 4);
printf("Sum: %d\n", sum); printf("Product: %d\n", product);
return 0;}
编译程序在编译 main.c 时,我们需要指定静态库的路径和库名。
gcc main.c -L. -lmath -o program
    • -L. 指定了静态库的搜索路径(当前目录)。

    • -lmath 指定了要链接的库,libmath.a 中的 math

运行程序:编译完成后,你可以运行生成的程序。

https://mp.weixin.qq.com/program

输出应该是:

Sum: 7Product: 12

这个简单的例子展示了如何创建一个静态库,并在另一个程序中使用它。记住,静态库在编译时被整合到可执行文件中,因此每次编译使用该库的程序时,都需要指定库的路径和名称。

想了解更多

赶紧扫码关注

编程小号
上一篇 2025-01-29 08:21
下一篇 2025-03-08 08:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/5136.html