c语言动态库与静态库

// show.h
#ifndef __SHOW_H_
#define __SHOW_H_

#include <stdio.h>
#include "math.h"

void show(int, char, int, pfunc);
#endif
// math.h
#ifndef __MATH_H_
#define __MATH_H_

typedef int (*pfunc)(int, int);

int add(int, int);

int sub(int, int);

#endif
// show.c
#include "show.h"

void show(int a, char con, int b, pfunc func) {
    printf("%d %c %d = %d\n", a, con, b, func(a, b));
}
// math.c
#include "math.h"

int add(int a, int b) {

    return a + b;
};

int sub(int a, int b) {

    return a - b;
};

静态库

// main.c
//调用静态库
#include "math.h"
#include "show.h"

int main(void) {
    int a = 10, b = 20;
    show(a, '+', b, add);
    show(a, '-', b, sub);
    // 打包静态库 ar -r libmath.a math.o show.o
   //             ar -r 动态库名称  动态库依赖的.o文件1 动态库依赖的.o文件2 ...

    // 如果依赖的文件就在当前目录 gcc -o test main.c libmath.a
    // 如果依赖的文件不在当前目录:例:在上一级目录  gcc -o test -lmath -L.. main.c
    /*
     * -l math 库名 (库名称必须lib开头才可以使用-l参数)
     * -L ..   依赖库所在的目录,绝对路径相对路径都可以
     * 如果依赖库不是lib开头的,那么需要直接指定依赖库的路径 例如:gcc -o lll  main.c ../math.a
     * 库路径也可以写到环境变量里,这样编译的时候gcc会从环境变量中设置的路径找依赖库,多个路径用冒号分割,例:LIBRARY_PATH=/lib:/usr/lib:usr/lib64:/usr/local/lib
     * */
    return 0;
}

动态库

// main.c
//调用动态库
#include "math.h"
#include "show.h"

int main(void) {
    int a = 10, b = 20;
    show(a, '+', b, add);
    show(a, '-', b, sub);
    //  动态库生成.o文件 gcc -c -fpic show.c
    //  打包动态库 gcc -shared -o libmath.so show.o math.o 
    //           gcc -shared -o 动态库名称  动态库依赖的.o文件1 动态库依赖的.o文件2 ...
    
    // 如果依赖的文件就在当前目录 gcc -o test main.c libmath.so
    // 如果依赖的文件不在当前目录:例:在上一级目录  gcc -o test -lmath -L.. main.c
    /*
     * -l math 库名 (库名称必须lib开头才可以使用-l参数)
     * -L ..   依赖库所在的目录,绝对路径相对路径都可以
     * 如果依赖库不是lib开头的,那么需要直接指定依赖库的路径 例如:gcc -o lll  main.c ../math.so
     * 库路径也可以写到环境变量里,这样编译的时候gcc会从环境变量中设置的路径找依赖库,多个路径用冒号分割,例:LIBRARY_PATH=/lib:/usr/lib:usr/lib64:/usr/local/lib
     * 与静态库不同的是动态库需要再程序运行时指定动态库路径,如果在当前目录下则不需要指定,多个路径用冒号分割,例:LD_LIBRART=/lib:/usr/lib:usr/lib64:/usr/local/lib
     * */
    return 0;
}

posted on 2023-02-07 16:53  信奉上帝的小和尚  阅读(41)  评论(0编辑  收藏  举报

导航