Loading

gcc编译器【自定义c库】

在 C 语言中,库分为静态库(.a 文件)和动态库(.so 文件,在 Linux 系统下;.dll 文件,在 Windows 系统下)。下面以 Linux 系统为例,分别介绍如何创建静态库和动态库,并在另一个 C 语言文件中调用这些库。

1. 创建包含函数的源文件

首先,创建一个包含所需函数的 C 文件和对应的头文件。假设我们要创建一个简单的函数用于计算两个整数的和。

math_utils.c

// math_utils.c
int add(int a, int b) {
    return a + b;
}

math_utils.h

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);

#endif

2. 创建静态库

步骤 1:编译源文件生成目标文件

使用 gcc 编译器将 math_utils.c 编译成目标文件 math_utils.o

gcc -c math_utils.c -o math_utils.o

-c 选项表示只进行编译,不进行链接。

步骤 2:创建静态库

使用 ar 工具将目标文件打包成静态库 libmath_utils.a

ar rcs libmath_utils.a math_utils.o
  • r:将目标文件插入到静态库中。
  • c:创建静态库,如果库文件不存在。
  • s:写入一个目标文件索引到库中,加快链接速度。

步骤 3:在另一个 C 文件中调用静态库

main.c
#include <stdio.h>
#include "math_utils.h"

int main() {
    int result = add(3, 5);
    printf("3 + 5 = %d\n", result);
    return 0;
}
编译并链接静态库
gcc main.c -L. -lmath_utils -o main
  • -L.:指定库文件的搜索路径,. 表示当前目录。
  • -lmath_utils:链接名为 libmath_utils.a 的静态库,-l 后面跟库名去掉 lib 前缀和 .a 后缀。
运行程序
./main

3. 创建动态库

步骤 1:编译源文件生成目标文件

使用 gcc 编译器将 math_utils.c 编译成目标文件 math_utils.o,并添加 -fPIC 选项,生成位置无关代码。

gcc -fPIC -c math_utils.c -o math_utils.o

-fPIC 选项确保生成的代码可以在不同的内存地址加载和执行。

步骤 2:创建动态库

使用 gcc 编译器将目标文件链接成动态库 libmath_utils.so

gcc -shared -o libmath_utils.so math_utils.o

-shared 选项表示创建动态库。

步骤 3:在另一个 C 文件中调用动态库

main.c(与静态库示例中的 main.c 相同)
#include <stdio.h>
#include "math_utils.h"

int main() {
    int result = add(3, 5);
    printf("3 + 5 = %d\n", result);
    return 0;
}
编译并链接动态库
gcc main.c -L. -lmath_utils -o main

同样,-L. 指定库文件的搜索路径,-lmath_utils 链接名为 libmath_utils.so 的动态库。

设置动态库搜索路径

在运行程序之前,需要告诉系统在哪里可以找到动态库。可以通过设置 LD_LIBRARY_PATH 环境变量来实现。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

这将当前目录添加到动态库搜索路径中。

运行程序
./main

通过以上步骤,你可以创建静态库和动态库,并在另一个 C 语言文件中调用这些库。静态库在链接时会被完整地包含在可执行文件中,而动态库在运行时才会被加载。

posted @ 2025-03-11 16:14  一只大学生  阅读(117)  评论(0)    收藏  举报