对于在Linux下编程来说,编写一个好的Makefile是非常重要的,写好了可以给编译带来极大的便利。而网上对于多目录下Makefile的编写讲解的非常少, 有很多都不能达到目的。这里参考了网上一篇Makefile,它是针对C语言的,写的挺不错。我将它改了一下,用于编译C++的Makefile。

参考链接在这里

https://blog.csdn.net/xiaoluoshan/article/details/78639961

1. 我的目录结构

>> common-存放一些公共的头文件。

>> debug-存放bin目录和obj目录,bin存放编译的最终可执行文件,obj存放生成的目录文件。

>> entity-存放实体的定义,包括头.h和.cpp文件。

>> include-存放项目的头文件。

>> network-存放socket通讯的封装。

>> protocols-协议解析的封装。

>> src-程序源文件,包括main函数实现在这里。

2. 最外层Makefile的编写,目录结构如图:

Makefile内容如下:

注意标红的地方,由于项目用到了c++11标准的一些东西,故加这个选项:-std=c++11。另外注意一下最后标红的这行的选项顺序。另外特别注意,如果最外层目录下有自己的目录不进入编译搜索,一定要使用awk排除排,否则编译会报错而中断。这一句:

SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "debug") print $$9}')

如果有多个目录要排除,这里要加入排除的其它目录,这里仅排除debug目录。

3. debug目录Makefile编写,目录结构如图:

Makefile内容如下:

这里我用到了libevent库以及多线程,所以加入了编译选项-levent –lpthread选项。

4. protocols目录Makefile.

由于其会引用外部头文件,所以Makefile中要加入包含路径,这样在程序代码中可以不用包括头文件的路径。Makefile文件格式如下:

注意这里,我加入了自己的头文件路径。再看代码调用的头文件引用:

#include "DataEntity.h"

引用了实体定义,不用带路径。

5.  其它目录Makefile

其它目录Makefile就基本都一样了,需要引用头文件就加入路径,其它项都一样:

6. 最后是一些Makefile编写注意混淆的地方。

(1Makefile中的 符号 $@, $^, $< 的意思:

  $@  表示目标文件

  $^  表示所有的依赖文件

  $<  表示第一个依赖文件

  $?  表示比目标还要新的依赖文件列表

2wildcardnotdirpatsubst的意思:

  wildcard : 扩展通配符

  notdir 去除路径

  patsubst :替换通配符

g++ *.o -o $@ -lpthread -levent

注意,指定链接成目标文件格式,.o目标文件一定要在前面,中间-o,最后才是最终生成的目标文件,位置不要调返了,否则编译不通过。

(3)  g++链接选项

-l+库名,表示链接库,如-lpthread表示链接pthread库,前面要加路径.

-levent表示需要连接libevent库。

-l  参数就是用来指定程序要链接的库,-l参数紧接着就是库名。

-L 参数跟着的是库文件所在的目录名。

-i (小写l)  编译程序到系统默认路进搜索,如果找不到,到当前目录,如果当前目录找不到,则到LD_LIBRARY_PATH等环境变量置顶的路进去查找,如果还找不到,那么编译程序提示找不到库。

多目录Makefile编写相关推荐

  1. 多文件Makefile编写

    工作过程中,平时不怎么关注Makefile的书写规则,对于遇到的编译错误一般能看懂Makefile的基本规则也能解决.但如果想要编写Makefile文件还是有相当的难度的,更不用说包含多个目录和文件的 ...

  2. 嵌入式(十四)——Makefile编写及多级目录

    文章目录 工程管理器make 1.1 什么是工程 1.2 工程管理器的作用 1.3 makefile文件 真目标和伪目标 1.4 执行顺序: 1.5 多级目录的Makefile编写 隔断 多级目录下的 ...

  3. [动态库]动态库生成和使用以及Makefile编写

    转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...

  4. Ubuntu下使用gcc和makefile编写c语言程序

    文章目录 前言 一.gcc编写c语言程序 1.hello world的输出 2.简单程序的编译与运行 3.windows环境下的编译运行结果对比 二.makefile编写c语言程序 总结 前言 本文通 ...

  5. Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)

    Linux下的makefile编写 前言 本人记笔记习惯使用OneNote,在学习LinuxC++过程中发现deepin上没有大佬开发或者移植,本人技术也不精,所以决定写博客记笔记(只是习惯问题,并没 ...

  6. 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试

    交叉工具链 安装: 将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下. 然后修改环境变量:执行命令 ...

  7. linux环境cpp/c文件的makefile编写(caffe举例)

    编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...

  8. linux 生成和使用动态链接库和静态链接库的Makefile编写

    引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...

  9. 多目录Makefile(库及分层目录)

    本文代码虽简单,但涉及比较复杂的各种调用关系,欲研究者需有耐心及清醒头脑. 切切!背景交待: 1.正在移植U-Boot,并对其源代码进行了一些分析,感觉它的Makefile十分强劲: 2.以前写的Ma ...

最新文章

  1. 一次地址选择器的实践
  2. 144. Binary Tree Preorder Traversal(非递归实现二叉树的前序遍历)
  3. l298n电机哪一端为正_一文详解电机倒顺开关接法!
  4. 文本显示变量_无代码软件开发文本字符显示设计
  5. C#总结项目《汽车租聘系统》项目代码实例【全注释版】
  6. linux c编程操作数据库(sqlite3应用)
  7. QT各版本的源码下载地址
  8. jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?
  9. system volume information是什么文件_如何扩展Unity URP的后处理Volume组件
  10. 2c总线的布线宽度_PCIExpress总线接口的布线规则
  11. 安装win10和ubuntu双系统启动不了解决
  12. Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。
  13. html5在线加密,HTML技巧——加密网页
  14. 浏览器首页被雨林木风篡改( /hao.ylmf.com/u7654.html)
  15. vue单页面背景颜色修改
  16. linux下IIC驱动开发分析
  17. 2、快速选择工具和魔棒工具
  18. 机房服务器维修,机房维护方案
  19. python添加横线代码_Python中的五种下划线
  20. 对@Primary理解

热门文章

  1. 量化专家丁鹏深度分析光大乌龙指
  2. 嘉定学计算机编程,嘉定附近儿童学编程费用
  3. 关于childNodes和children区别
  4. SecureCRT--远程连接工具
  5. USACO Section 5.4 Betsy's Tour
  6. Gradient Based Bilinear Demosaic
  7. 阀盖零件/汽车连杆/发动机连杆/左支座/后钢板弹簧吊耳/法兰盘/拨叉/轴承座/后托架/齿轮油泵泵体/手柄座/杠杆/连接座/手柄套/十字头零件/活塞……加工工艺及夹具毕业设计、课程设计题目推荐
  8. Android3D旋转动画库--Rotate3D
  9. APP “本机号码一键登录”,是如何实现的?
  10. ‘BertTokenizer‘ has no len() additional_special_tokens add_tokens