使用makefile生成.so文件

1.前言

在大型的C/C++工程中,为了节省编译时间,一般都会将一些不会改动的文件生成为动态库(如.so文件),这样可以让链接过程放在运行的时候。
在工程量较少的时候可以自己写语句来生成动态库:

g++ -shared -fPIC -o libTestLib.so Test.cpp

但是当工程量很大的时候,包含的文件非常多,自己写语句就会非常麻烦,因此需要一种工具来自动化生成.so文件。make就是一种可以实现自动化编译的工具,只要你写好了makefile,然后在终端上输入make指令,就可以实现自动编译(make命令会自己去寻找里面的makefile文件)

2.makefile规则

一般在windows下很少有人用这些,因为大多数的IDE(如VS)都已经为你做好了这些工作。
首先了解一下makefile的规则:

target...: prerequisites
	command

target代表的是目标文件,他可以是可执行文件,也可以是动态库,prerequisites 代表的是生成target所需要的文件或目标
command就是命令

3.makefile实例

首先我的工程目录:
main.cpp
./src/operation.cpp
./src/out_function.cpp
./include/operation.h
./include/out_function.h

我的目标是通过operation.cpp和out_function.cpp来生成一个.so的动态库,然后进行动态链接。
在生成.so时,我们可以先生成中间文件.o文件,也可以直接使用cpp文件。
首先是生成.so文件的makefile文件:

target = liboper.so
cc = g++
srcs = $(wildcard ./src/*.cpp)
includes = -I./include/
OBJS    =$(patsubst %cpp, %o, $(srcs))

CFLAGS  =-std=c++11 -shared -fPIC
all: $(target)
$(target): $(OBJS)
	$(cc) $(CFLAGS) $(OBJS) -o $@
	
%.o:%.cpp
	$(cc) -c -pthread $(INCLUDES) $(CFLAGS) $^ -o $@

target:我要生成的目标文件
cc:我使用的编译指令
src:我需要编译的对象
wildcard:通配符,这里表示./src下所有的cpp文件
OBJS: 我编译时需要的中间对象(一般来说是.o文件),这里是将src中所有的cpp文件替换成.o文件
includes:头文件目录(这里没用到)
CFLAGS:编译选项,里面的内容就是生成.so文件需要的编译选项
all:编译需要生成哪些目标文件,因为有些情况会生成多个目标文件,all后面可以指定自己要生成哪些目标文件

然后在终端输入make命令就可以生成最终的liboper.so文件,然后我们需要在编译main.cpp的时候指定我们要使用的动态库:

g++ main.cpp -L./ -loper -o demo

-L:依赖的库所在的目录
-l:依赖的具体动态库

4.总结与感悟

因为最近的项目涉及到了这些,因此粗略的学习了一下makefile,当然只能说略懂一点,后续还要跟进。如果有不对的地方希望大家指点~

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值