一、静态库
目录结构
1)在src文件夹中将所有的.c文件生成.o文件
g++ -c *
2)将.o文件打包成静态库
ar rcs libmath.a *.o
3)在main.cpp文件夹编译main.cpp文件
g++ -o main main.cpp -L./src -lmath //-L为静态库包含的路径,-l为静态库名字
二、动态库
1)直接生成动态库
g++ -shared -fPIC -o libmath.so *.cpp
2)将动态库所在路径加入搜索路径,在src中,或者cp libmath.so /usr/lib中
export LD_LIBRARY_PATH=.
3)动态编译
g++ -o main main.cpp -L./src -lmath // -L为动态库包含的路径,-l为动态库名字,2)3)中包含的路径都要正确
如果缺少2),可执行文件可以生成,但该可执行文件执行会报错无法找到动态库
三、使用makefile实现
分为两部分compile和link,link相关的为使用的静态库和动态库,compile为生成对应的.o文件,包括相关的为头文件路径,CFLAGS等
VERSION =1.00 #可能会存在多个版本
CC =g++ #编译器,特殊变量
DEBUG = #有些代码通过宏定义来确定是否编译,-D后面为宏定义
CFLAGS =-Wall #CFLAGS为特殊变量,传入编译条件,-Wall只会显示错误的警告
SOURCES =$(wildcard ./source/*.cpp) #wildcard函数获取指定路径下的所有文件
INCLUDES =-I./include #指定头文件路径
LIB_NAMES =-lmymath #指定所需库文件名称
LIB_PATH =-L./lib #指定库文件所在路径
OBJ =$(patsubst %.c, %.o, $(SOURCES)) #函数名与参数之间没有逗号,参数之间有
TARGET =app
#links
$(TARGET):$(OBJ)
@mkdir -p bin #@表示该命令不会在屏幕上显示
$(CC) $(OBJ) $(LIB_PATH) $(LIB_NAMES) -o bin/$(TARGET)$(VERSION)
#@rm -rf $(OBJ)
#compile
%.o: %.c
$(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
@echo "Remove linked and compiled files......"
rm -rf $(OBJ) $(TARGET) bin
makefile实现静态库编译
分为两部分compile和AR打包,AR打包即为AR命令ar -rcs libmymath.a add.o sub.o div.o multi.o,compile为生成对应的.o文件,包括相关的为头文件路径,CFLAGS等
CC = g++
AR = ar
ARFLAGS = -rcs
CFALGS = -Wall
INCLUDES = -I./include
SOURCES = $(wildcard ./source/*.cpp)
OBJ = $(patsubst %cpp, %o, $(SOURCES))
TARGET = libmymath
#link
$(TARGET) : $(OBJ)
@mkdir -p lib
$(AR) $(ARFLAGS) lib/$(TARGET).a $(OBJ) #ar -rcs 后面先接静态库名字,最后再写依赖项
@rm $(OBJ)
#compile
%.o : %.cpp
$(CC) $(CFALGS) $(INCLUDES) -c $^ -o $@
.PHONY : clean
clean:
@echo "remove link and compiled files..."
rm -rf $(OBJ) lib
makefile编译动态库
CC = g++
SOURCES = $(wildcard ./source/*.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SOURCES))
INCLUDE = -I./include
SHARED = -shared
FPIC = -fPIC
CFLAGS = -Wall
TARGET = libmymath
#link
$(TARGET) : $(OBJ)
@mkdir -p lib
$(CC) $(SHARED) $(FPIC) $(CFLAGS) -o ./lib/$(TARGET).so $(OBJ)
@rm $(OBJ)
#compile
%.o : %.cpp
$(CC) $(INCLUDE) $(FPIC) $(CFLAGS) $^ -c -o $@
.PHONY : clean
clean:
@echo "remove link and compiled files..."
rm -rf lib