linux构建静态库和动态库,makefile使用

本文详细介绍了在Linux环境下如何创建和使用静态库与动态库。首先,通过`gcc -c`将`.c`文件编译为`.o`目标文件,然后使用`ar`命令打包成静态库`.a`。对于动态库,使用`g++ -shared -fPIC`生成`.so`文件,并通过设置`LD_LIBRARY_PATH`环境变量确保运行时能找到动态库。此外,还展示了如何利用`makefile`自动化编译链接过程。
摘要由CSDN通过智能技术生成

一、静态库
目录结构
在这里插入图片描述
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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值