静动态库的编译和使用教程
静态库编译和使用流程
静态库编译流程
-
编写源码文件
// add.c int add(int a, int b) { return a + b; }
-
编译为目标文件
gcc -c add.c -o libadd.a
或显示使用 ar 命令
shell ar rcs libadd.a add.o
静态库使用流程
-
编写使用静态库的源代码文件
// main.c #include <stdio.h> int add(int, int); int main() { printf("Sum: %d\n", add(3, 4)); return 0; }
-
编译链接
gcc main.c libadd.a -o app
-
运行程序
./app
动态库的编译和使用流程
动态库的编译流程
-
编写源代码文件
// add.c int add(int a, int b) { return a + b; }
-
编译为共享目标文件
gcc -fPIC -shared add.c -o libadd.so
隐式加载动态库使用流程
-
编写使用动态库的源代码文件
// main.c #include <stdio.h> int main() { printf("Sum: %d\n", add(3, 4)); return 0; }
-
编译链接
gcc main.c -L. -ladd -o app
-
运行程序
./app
显式加载动态库使用流程
-
编写使用动态库的源代码文件
// main.c #include <stdio.h> #include <dlfcn.h> int main() { void* handle = dlopen("./libadd.so", RTLD_LAZY); if (handle == NULL) { fprintf(stderr, "Error opening library: %s\n", dlerror()); return 1; } // Function pointer int (*add)(int, int) = dlsym(handle, "add"); if (add == NULL) { fprintf(stderr, "Error finding add function: %s\n", dlerror()); dlclose(handle); return 1; } // Use the function printf("Sum: %d\n", add(3, 4)); dlclose(handle); return 0; }
-
编译链接
gcc main.c -ldl -o app
-
运行程序
./app
隐式与显式示例代码的不同
隐式加载示例代码中,直接调用 add 函数,不需要使用 dlopen 和 dlsym。显式加载示例代码中,使用 dlopen 和 dlsym 函数动态加载并调用库中的函数。