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...: prerequisitescommand

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

使用makefile生成.so文件相关推荐

  1. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  2. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  3. qmake 没有生成.o文件_qmake实用变量

    一些项目开发中用到的qmake实用变量. 示例 TARGET = MyApp DESTDIR = $$PWD message($$TARGET) # 生成目标的名字 message($$DESTDIR ...

  4. makefile 生成.o_要学好 C 语言 / C++ ,Makefile 可少不了

    一.Makefile 简介 Makefile 是什么? Makefile 通常指的是一个含有一系列命令(directive)的,通过 Make 自动化编译工具,帮助 C/C++ 程序实现自动编译目标文 ...

  5. Win7 64b的VS2015 如何使用nmake成功编译detour express 3.0-error2202 警告被视为错误 - 没有生成“object”文件

    首先打开你的开始目录,找到VS2015,找到如图1所示的开发人员命令提示.打开 图1 从开始菜单打开VS的开发人员命令行 图2 打开VS2015开发人员命令提示 傻瓜式安装detour express ...

  6. 1217_使用SCons生成目标文件

    全部学习汇总: GitHub - GreyZhang/g_SCons: A new member in my toolbox, looking forward to replacing make to ...

  7. linux解决make依赖关系,makefile 自动处理头文件的依赖关系

    现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h ...

  8. php dwg格式,无需AutoCAD,用C#生成DWG文件

    是一个类库:Teigha.NET for .DWG 利用它就可以在无需安装AutoCAD软件的情况下,生成.读取DWG文件,适合那些导入导出的场合. Teigha曾用名OpenDWG .DWGdire ...

  9. Linux - 如何生成configure文件

    Linux - 如何生成configure文件 简介 本文简单地介绍一下如何生成configure文件,主要目的是把握整体的流程,以后如果要用到再仔细阅读对应文档. 整体的过程 在Linux下面手动编 ...

  10. 四、Makefile包含 头文件和库文件

    一.Makefile规则 二.Makefile案例-多个文件生成一个目标文件 三.Makefile–生成多个目标文件 四.Makefile包含 头文件和库文件 此篇文章以三.Makefile–生成多个 ...

最新文章

  1. 浅析商城网站建设需要注意哪些细节内容呢?
  2. thinking-in-java(16) 数组
  3. “睡服”面试官系列第六篇之set数据结构(建议收藏学习)
  4. swift中为什么要创造出可选型?
  5. 数据库学习之MySQL安装
  6. 请给出一个时间为O(nlgk)、用来将k个已排序链表的算法。此处n为所有输入链表中元素的总数。...
  7. 还争什么流量场景,罗振宇已经用时间挣钱了!
  8. axios拦截器_Axios源码解析 —— 一个小而美的HttpClient
  9. 大华相机RTSP获取视频方式
  10. 神经网络软件有哪些,神经网络分析软件
  11. iOS小技能: 自定义相机(基础知识储备)
  12. 错过2021牛股?2022ESG投资预测拿住
  13. 小程序地理位置接口申请
  14. 低效程序员的九个坏习惯
  15. The Thirty-fourth Of Word-Day
  16. 智能计算系统课程笔记05:编程框架机理
  17. 气传导和骨传导耳机哪个好?简单科普这两种蓝牙耳机
  18. 『与善仁』Appium基础 — 3、移动端测试环境搭建(三)之AVD模拟器安装
  19. 【工业互联网】工业互联网
  20. 2015阿里系统工程师面试经验分享(广州站)

热门文章

  1. c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法
  2. DIALOGBOXPARAMA
  3. 诺顿企业版本最新版本14.2安装测试SymantecEndpointProtection_14.2.0_MP1
  4. python编写tftp服务器
  5. 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
  6. 计算机控制的液压提升,LSD液压提升系统(2008).doc
  7. Cisco模拟器教程
  8. WINCE6.0+ILI9806E驱动IC显示屏调试总结
  9. 浅谈易用性测试及GUI常见的测试要求
  10. java 正则表达式 例子_Java正则表达式例子汇总