静态库和动态库简单理解就是对目标文件的打包操作
一般情况下的静态库命名规则:
例如:
在Windows下.lib和.a都可以表示静态库,但是使用的时候
静态库的特点:
lib: library 库
a : archive 档案
动态库:有**“动态链接库”和“共享对象”**的叫法。
一般情况下的动态库命名规则:
例如:
DLL: Dynamic Link Library 动态链接库
SO: Shared Object 共享对象
动态库的特点:
从静态库和动态库的特点就可以看得的是,静态库的优点就是动态库的缺点,动态库的优点就是静态库的缺点。
关于静态库和动态库的创建要注意的事项:
头文件:myMath.h
#ifndef _myMath_H_
#define _myMath_H_
typedef struct MyMath
{
int a;
int b;
}myMath;
MyMath* creatMathObject(int a,int b);
int add(MyMath* mobj);
int sub(MyMath* mobj);
void delMathObject(MyMath* mobj);
#endif
源文件:myMath.c
#include "myMath.h"
#include
#include
#include
MyMath* creatMathObject(int a,int b)
{
MyMath* mobj=(MyMath*)malloc(sizeof(MyMath));
assert(mobj);
mobj->a=a;
mobj->b=b;
return mobj;
}
int add(MyMath* mobj)
{
return mobj->a+mobj->b;
}
int sub(MyMath* mobj)
{
return mobj->a-mobj->b;
}
void delMathObject(MyMath* mobj)
{
if(mobj==NULL)
return ;
free(mobj);
mobj=NULL;
}
进入终端
gcc -c myMath.c -o myMath.o -static
# 生成静态库要加-static选项,位置在不脱离现实的情况下随便放
ar -crus libmymath1.lib myMath.o
# 生成静态库文件,方式一
ar -crus libmymath2.a myMath.o
# 生成静态库文件,方式二
# c create
# r replace
# u update
# s search
头文件和源文件还是上面的
进入终端:
gcc -c myMath.c -o myMath.o -fpic
# 先生成.o文件,-fpic选加
gcc myMath.o -o libmymath3.dll -shared
# 生成动态库文件
#也可以将两个命令结合在一起
gcc -c myMath.c -o libmymath3.dll -fpic -shared
# -shared是生成动态库的关键选项,在不脱离现实的情况下位置无关
# -fpic是选加的
# f file
# p position
# i independent
# c code
使用之前的条件:
和本地的项目源文件放在以下,操作起来很简单。
直接把头文件包含过来
//main.c
#include
#include "myMath.h" //没有源文件,源文件已经被编译成静态库文件了
int main()
{
MyMath* mobj=creatMathObject(7,5);
int result=add(mobj);
printf("%d\n",result);
result=sub(mobj);
printf("%d\n",result);
delMathObject(mobj);
printf("over\n");
return 0;
}
进入终端:
# 正常编译操作生成main.o
gcc -c main.c -o main.o
# 链接的时候需要把静态库也链接过来
gcc main.o -L. -llibmymath1 -o main.exe # .lib
# gcc main.o -L. -lmymath1 -o main.exe # 会报错
gcc main.o -L. -lmymath2 -o main2.exe # .a
目录结构
.
|--bin
|--include
|--myMath.h
|--lib
|--libmymath1.lib
|--libmymath2.a
|--obj
|--src
|--main.c # main.c文件还是上面的
进入终端:
# 正常编译操作生成main.o
gcc -c src/main.c -o obj/main.o -I include
# 链接的时候需要把静态库也链接过来
gcc main.o -L./lib -llibmymath1 -o bin/main.exe # .lib
gcc main.o -L./lib -lmymath2 -o bin/main2.exe # .a
基于Windows下使用动态库
使用条件:
还是上面的main.c文件
进入终端:
# 正常编译操作生成main.o
gcc -c main.c -o main.o
# 链接的时候需要把动态库也链接过来
gcc main.o -L. -llibmymath3 -o main.exe # .lib
./main.exe # 成功运行
目录结构:
.
|--bin
|--libmymath3.dll
|--include
|--myMath.h
|--obj
|--src
|--main.c # main.c文件还是上面的
进入终端:
# 正常编译操作生成main.o
gcc -c src/main.c -o obj/main.o -I include
# 链接的时候需要把动态库也链接过来
gcc main.o -L./bin -llibmymath3 -o bin/main.exe # .lib
cd bin
./main.exe #正常运行
单文件就不写Makefile了,太简单了直接使用gcc命令比较简单也比快捷
BIN=./bin
OBJ=./obj
INC=./include
SRC=./src
LIB=./lib
SRCS=$(wildcard $(SRC)/*.c)
OBJS=$(patsubst %.c,$(OBJ)/%.o,$(notdir $(SRCS)))
TARGET=main
TARGET_PATH=$(BIN)/$(TARGET)
CC=gcc
CFLAGS=-g -Wall -I$(INC)
LIB_PATH=-L $(LIB)
LIB_FLAGS=-l libzzz
$(TARGET_PATH):$(OBJS)
$(CC) $^ $(LIB_PATH) $(LIB_FLAGS) -o $@
$(OBJ)/%.o:$(SRC)/%.c
$(CC) -c $(CFLAGS) $^ -o $@
.PHONY: clean
clean:
del /Q /F obj
BIN=./bin
OBJ=./obj
INC=./include
SRC=./src
SRCS=$(wildcard $(SRC)/*.c)
OBJS=$(patsubst %.c,$(OBJ)/%.o,$(notdir $(SRCS)))
TARGET=main
TARGET_PATH=$(BIN)/$(TARGET)
CC=gcc
CFLAGS=-g -Wall -I$(INC)
LIB_PATH=-L$(BIN)
LIB_FLAGS=-lmymath
$(TARGET_PATH):$(OBJS)
$(CC) $^ $(LIB_PATH) $(LIB_FLAGS) -o $@
$(OBJ)/%.o:$(SRC)/%.c
$(CC) -c $(CFLAGS) $^ -o $@
.PHONY: clean
clean:
del /Q /F obj
BIN=./bin
OBJ=./obj
INC=./include
SRC=./src
LIB=./lib
SRCS=$(wildcard $(SRC)/*.c)
OBJS=$(patsubst %.c,$(OBJ)/%.o,$(notdir $(SRCS)))
TARGET=main
TARGET_PATH=$(BIN)/$(TARGET)
CC=gcc
CFLAGS=-g -Wall -I$(INC)
LIB_PATH=-L$(BIN) -L$(LIB)
LIB_FLAGS=-lmathdm -llibmathas
$(TARGET_PATH):$(OBJS)
$(CC) $^ $(LIB_PATH) $(LIB_FLAGS) -o $@
$(OBJ)/%.o:$(SRC)/%.c
$(CC) -c $(CFLAGS) $^ -o $@
.PHONY: clean
clean:
del /Q /F obj
搭配视频看会更好哟!!!
C/C++静态库和动态库基于Windows和VScode