使用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,当然只能说略懂一点,后续还要跟进。如果有不对的地方希望大家指点~

    原文作者:不服就Gan
    原文地址: https://blog.csdn.net/qq_23946481/article/details/119392123
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞