多目录Makefile编写
对于在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编写注意混淆的地方。
(1)Makefile中的 符号 $@, $^, $< 的意思:
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
(2)wildcard、notdir、patsubst的意思:
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编写相关推荐
- 多文件Makefile编写
工作过程中,平时不怎么关注Makefile的书写规则,对于遇到的编译错误一般能看懂Makefile的基本规则也能解决.但如果想要编写Makefile文件还是有相当的难度的,更不用说包含多个目录和文件的 ...
- 嵌入式(十四)——Makefile编写及多级目录
文章目录 工程管理器make 1.1 什么是工程 1.2 工程管理器的作用 1.3 makefile文件 真目标和伪目标 1.4 执行顺序: 1.5 多级目录的Makefile编写 隔断 多级目录下的 ...
- [动态库]动态库生成和使用以及Makefile编写
转自:https://www.cnblogs.com/ljtknowns/p/5647793.html 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc ...
- Ubuntu下使用gcc和makefile编写c语言程序
文章目录 前言 一.gcc编写c语言程序 1.hello world的输出 2.简单程序的编译与运行 3.windows环境下的编译运行结果对比 二.makefile编写c语言程序 总结 前言 本文通 ...
- Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)
Linux下的makefile编写 前言 本人记笔记习惯使用OneNote,在学习LinuxC++过程中发现deepin上没有大佬开发或者移植,本人技术也不精,所以决定写博客记笔记(只是习惯问题,并没 ...
- 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试
交叉工具链 安装: 将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下. 然后修改环境变量:执行命令 ...
- linux环境cpp/c文件的makefile编写(caffe举例)
编译单个cpp文件 方法一.g++ 文件名.cpp,生成一个名为 "文件名.out" 的可执行文件 方法二.g++ -c 文件名.cpp -o 新文件名.o:生成一个被命名成 &q ...
- linux 生成和使用动态链接库和静态链接库的Makefile编写
引用 Jesse Rei 的 linux 生成和使用动态链接库和静态链接库的Makefile编写 生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接 ...
- 多目录Makefile(库及分层目录)
本文代码虽简单,但涉及比较复杂的各种调用关系,欲研究者需有耐心及清醒头脑. 切切!背景交待: 1.正在移植U-Boot,并对其源代码进行了一些分析,感觉它的Makefile十分强劲: 2.以前写的Ma ...
最新文章
- 一次地址选择器的实践
- 144. Binary Tree Preorder Traversal(非递归实现二叉树的前序遍历)
- l298n电机哪一端为正_一文详解电机倒顺开关接法!
- 文本显示变量_无代码软件开发文本字符显示设计
- C#总结项目《汽车租聘系统》项目代码实例【全注释版】
- linux c编程操作数据库(sqlite3应用)
- QT各版本的源码下载地址
- jar打包 剔除第三方依赖以及它的依赖_为什么Spring Boot的 jar 可以直接运行?
- system volume information是什么文件_如何扩展Unity URP的后处理Volume组件
- 2c总线的布线宽度_PCIExpress总线接口的布线规则
- 安装win10和ubuntu双系统启动不了解决
- Python3,10行代码,给pdf文件去水印,再也不用花费冤枉钱了。
- html5在线加密,HTML技巧——加密网页
- 浏览器首页被雨林木风篡改( /hao.ylmf.com/u7654.html)
- vue单页面背景颜色修改
- linux下IIC驱动开发分析
- 2、快速选择工具和魔棒工具
- 机房服务器维修,机房维护方案
- python添加横线代码_Python中的五种下划线
- 对@Primary理解
热门文章
- 量化专家丁鹏深度分析光大乌龙指
- 嘉定学计算机编程,嘉定附近儿童学编程费用
- 关于childNodes和children区别
- SecureCRT--远程连接工具
- USACO Section 5.4 Betsy's Tour
- Gradient Based Bilinear Demosaic
- 阀盖零件/汽车连杆/发动机连杆/左支座/后钢板弹簧吊耳/法兰盘/拨叉/轴承座/后托架/齿轮油泵泵体/手柄座/杠杆/连接座/手柄套/十字头零件/活塞……加工工艺及夹具毕业设计、课程设计题目推荐
- Android3D旋转动画库--Rotate3D
- APP “本机号码一键登录”,是如何实现的?
- ‘BertTokenizer‘ has no len() additional_special_tokens add_tokens