静动态库的编译和使用教程

#Technomous #编译

静态库编译和使用流程

静态库编译流程

  1. 编写源码文件

    // add.c
    int add(int a, int b) {
        return a + b;
    }
    
  2. 编译为目标文件

    gcc -c add.c -o libadd.a
    

或显示使用 ar 命令

shell ar rcs libadd.a add.o

静态库使用流程

  1. 编写使用静态库的源代码文件

    // main.c
    #include <stdio.h>
    
    int add(int, int);
    
    int main() {
        printf("Sum: %d\n", add(3, 4));
        return 0;
    }
    
  2. 编译链接

    gcc main.c libadd.a -o app
    
  3. 运行程序

    ./app
    

动态库的编译和使用流程

动态库的编译流程

  1. 编写源代码文件

    // add.c
    int add(int a, int b) {
        return a + b;
    }
    
  2. 编译为共享目标文件

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

隐式加载动态库使用流程

  1. 编写使用动态库的源代码文件

    // main.c
    #include <stdio.h>
    
    int main() {
        printf("Sum: %d\n", add(3, 4));
        return 0;
    }
    
  2. 编译链接

    gcc main.c -L. -ladd -o app
    
  3. 运行程序

    ./app
    

显式加载动态库使用流程

  1. 编写使用动态库的源代码文件

    // 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;
    }
    
  2. 编译链接

    gcc main.c -ldl -o app
    
  3. 运行程序

    ./app
    
隐式与显式示例代码的不同

隐式加载示例代码中,直接调用 add 函数,不需要使用 dlopen 和 dlsym。显式加载示例代码中,使用 dlopen 和 dlsym 函数动态加载并调用库中的函数。