// 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;
}