静态库与动态库的构建(含具体代码可以实操)

简介: 静态库与动态库的构建(含具体代码可以实操)

静态库和动态库是常见的代码重用方式,静态库在编译时将函数库直接嵌入程序中,而动态库在程序运行时动态链接函数库。下面是静态库和动态库的构建方法,包括具体代码可以实操:

构建静态库

静态库是在编译时链接到目标程序中,使用静态库的程序无需依赖外部的库文件,因此程序的可移植性较强。下面是构建静态库的步骤:

a. 编写库代码

构建静态库需要先编写函数库代码。下面是一个简单的示例库代码:

// add.h

ifndef ADD_H

define ADD_H

int add(int a, int b);

endif

// add.c

include "add.h"

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

b. 编译库代码

使用gcc编译库代码,并将编译结果打包为静态库文件。假设我们将静态库文件命名为libadd.a,可以使用以下命令进行编译:

gcc -c add.c -o add.o
ar rcs libadd.a add.o

其中,-c选项表示仅编译代码而不进行链接,-o选项用于指定编译结果输出文件名,-r选项表示替换曾经打包的目标文件,-s选项表示为静态库生成符号表。

c. 使用静态库

使用静态库的程序需要在编译时指定静态库文件,并链接库文件到目标程序中。假设我们使用以下代码示例进行测试:

// main.c

include

include "add.h"

int main(void) {
int result = add(1, 2);
printf("1 + 2 = %d\n", result);
return 0;
}

则可以使用以下命令进行编译和链接:

gcc main.c -o main -L. -ladd

其中,main.c是主程序代码文件,-o选项指定输出文件名,-L选项指定库文件所在目录,-l选项指定需要链接的库文件。

构建动态库

动态库是在程序运行时动态链接到目标程序中,这样可以将库文件共享,减少内存的占用空间。下面是构建动态库的步骤:

a. 编写库代码

构建动态库的步骤与静态库类似,需要先编写函数库代码。下面是一个示例库代码:

// add.h

ifndef ADD_H

define ADD_H

int add(int a, int b);

endif

// add.c

include "add.h"

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

b. 编译库代码

使用gcc编译库代码,并将编译结果打包为动态库文件。假设我们将动态库文件命名为libadd.so,可以使用以下命令进行编译:

gcc -c -fPIC add.c -o add.o
gcc -shared add.o -o libadd.so

其中,-shared选项表示生成动态共享库,-fPIC选项表示生成与位置无关的代码。

c. 使用动态库

使用动态库的程序需要在运行时加载动态库文件。假设我们使用以下代码示例进行测试:

// main.c

include

include

int main(void) {
void *handle = dlopen("./libadd.so", RTLD_LAZY);
if (handle == NULL) {
fprintf(stderr, "Failed to open add library: %s\n", dlerror());
return 1;
}

typedef int (*add_func_t)(int, int);
add_func_t add = (add_func_t)dlsym(handle, "add");
if (add == NULL) {
    fprintf(stderr, "Failed to get add function: %s\n", dlerror());
    return 1;
}

int result = add(1, 2);
printf("1 + 2 = %d\n", result);

dlclose(handle);
return 0;

}

则可以使用以下命令进行编译和链接:

gcc main.c -o main -ldl

其中,main.c是主程序代码文件,-o选项指定输出文件名,-ldl选项指定需要链接的动态链接库。

以上就是静态库和动态库的构建方法和具体代码实现。

相关文章
|
3月前
|
开发工具 iOS开发
制作传统动态库和静态库遇到的问题
制作传统动态库和静态库遇到的问题
31 1
|
3月前
|
编译器 程序员 C语言
静态库与动态库的构建(含具体代码可以实操)
静态库与动态库的构建(含具体代码可以实操)
24 0
|
9月前
|
程序员 vr&ar C语言
C/C++静态库和动态库的制作、使用、优缺点
C/C++静态库和动态库的制作、使用、优缺点
167 0
|
存储 Linux 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
242 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(一)
|
Linux Shell 编译器
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库
347 0
【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库(二)
|
自然语言处理 编译器 Linux
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(二)
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解
529 0
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(二)
|
存储 Ubuntu Unix
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(一)
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解
320 0
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(一)
|
NoSQL 编译器 Linux
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(三)
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解
276 0
【三、深入浅出GCC编译器】一个源文件到可执行文件是如何生成的:GCC编译工具链及编译参数详解(三)
|
NoSQL 编译器 vr&ar
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
199 0
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
|
Linux
Linux环境封装静态库成动态库
Linux环境封装静态库成动态库
173 0