Makefile编写及一个简单的Makefile架构实现

  • Makefile常用命令
  • GCC/G++常用编译参数
  • 简单Makefile框架实现
  • 使用CMake构建项目

Makefile常用命令

make Makefile/makefile/GNUMakefile
当Makefile名字不是上述三个名字时,需要加-f 去编译,如xxx.mk文件,需使用make -f xxx.mk 去编译;

GCC/G++常用编译参数

  • -shared
    Produce a shared object which can then be linked with other objects to for man executable. Not all systems support this option.
  • -D_REENTRANT
    在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变。类似的问题还存在于fputs之类的函数中,这些函数通常用一个单独的全局性区域来缓存输出数据。
    为解决这个问题,需要使用可重入的例程。可重入代码可以被多次调用而仍然工作正常。编写的多线程程序,通过定义宏_REENTRANT来告诉编译器我们需要可重入功能,这个宏的定义必须出现于程序中的任何#include语句之前。
    _REENTRANT为我们做三件事情,并且做的非常优雅:
    (1)它会对部分函数重新定义它们的可安全重入的版本,这些函数名字一般不会发生改变,只是会在函数名后面添加_r字符串,如函数名gethostbyname变成gethostbyname_r。
    (2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入函数。
  • Makefile三个非常有用的变量
    分别是 @ , @, @,^,$<代表的意义分别是:
    $@–目标文件,$^–所有的依赖文件,$$<–第一个依赖文件。
  • -w -W和-Wall选项
    -w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。
    -Wall选项意思是编译后显示所有警告。
    -W选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。

简单Makefile框架实现

此处将写三个makefile文件,它们为了大型项目的集成,将一个全要素的makefile文件拆分开来编写,然后通过include相关联;
##Makefile代码框架##

###MakeFileTemplate###

#########################################################
###############Makefile Path公共变量定义#################
#########################################################
EB_SRC_PATH = $(JTTS_SRC_ROOT)/src/Product/Engine/jTTS_EB9
EB_SRC_COMMON=$(JTTS_SRC_ROOT)/src/Product/Engine/common
EB_RELEASE_PATH =$(JTTS_SRC_ROOT)/bin
EB_LIB_PATH=$(JTTS_SRC_ROOT)/libs
##########################################################
####GCC编译参数定义
##########################################################
CC :=g++
INCLUDE :=
LIBS :=
DEFS :=
CFLAGS := -g -w -O2 -rdynamic
SRC_FILES :=
INSTDIR :=
LIB_INC :=
###########################################################
# define gloab variable
###########################################################
TARGET = libjTTS_EB9.so
TARGET_COPY = libjTTS_EB9.so
MODULE_OUTPUT_PATH = $(EB_RELEASE_PATH)/$(TARGET_COPY)INCLUDE +=-I$(EB_SRC_PATH) \-I$(JTTS_SRC_ROOT)/src/Product/OSLayer/include \-I$(EB_SRC_COMMON) \-I$(EB_SRC_PATH) \-I$(JTTS_SRC_ROOT)/src/Ext_SDK/Ext_SDK/EB/include \-I$(JTTS_SRC_ROOT)/src/Common/include \-I$(JTTS_SRC_ROOT)/src/Product/Common/include \-I$(JTTS_SRC_ROOT)/src/Ext_SDK/Encrypt \-I$(JTTS_SRC_ROOT)/depends/ACE_wrappers \-I$(JTTS_SRC_ROOT)/depends LIB_INC +=-L$(EB_LIB_PATH) \-L$(EB_RELEASE_PATH) \-L$(EB_SRC_PATH)SRC_FILES += $(shell find $(EB_SRC_PATH) -name jTTS_EB.cpp)
SRC_FILES += $(shell find $(EB_SRC_PATH) -name ejTTSAgent.cpp)
SRC_FILES += $(shell find $(EB_SRC_PATH) -name ejTTSInstance.cpp)
SRC_FILES += $(shell find $(EB_SRC_PATH) -name Win_Linux_file_func.cpp)
SRC_FILES += $(shell find $(EB_SRC_COMMON) -name CQueue.cpp)
SRC_FILES += $(shell find $(EB_SRC_COMMON) -name backaudio.cpp)
SRC_FILES += $(shell find $(EB_SRC_COMMON) -name JIniFile.cpp)LIBS += -lOSLayer \-lACE \-ljTTS_Audio \-liconv \libjtsecure_app.a \libjtsecure_engine.a \-lmkl_rt \-lSmallFile \-lz \-lpthread \-lrt \-ldlALL:$(TARGET)cp $(EB_SRC_PATH)/$(TARGET)  $(EB_RELEASE_PATH)/$(TARGET_COPY) -f%.o:%.cpp$(CC) -fPIC -c $(SRC_FILES) $(INCLUDE)OBJ_SRC=$(addprefix $(EB_SRC_PATH)/,$(notdir $(SRC_FILES:%.cpp=%.o)))$(TARGET): $(OBJ_SRC)$(CC) -shared -o  $(TARGET) $(OBJ_SRC) ${LIBS} $(LIB_INC)clean:-rm -f $(TARGET) -rm -f  *.o 

###def.app.mak###

##########################################################
#所有的编译用的makefile都必须引用该文件
##########################################################include $(XS_ROOT)/build/common_mak/def_pub.mak
CC :=g++
INCLUDE :=
LIBS :=
DEFS :=
#ifeq ($(ATN_FLAG_WALL_DELETE),yes)
#CFLAGS := -Os
#else
CFLAGS := -O2
#endif
SRC_FILES :=
INSTDIR :=###########################################################
# define gloab variable
###########################################################ifneq ($(PRODUCT_TYPE),PTN)
ENDIAN_DEFS := -DVOS_BYTE_ORDER=VOS_BIG_ENDIAN
endif### public define ###
ifeq ($(CPU_INSX),x8664)
DEFS += -DVOS_OS_VER=4
DEFS += -DVOS_HARDWARE_PLATFORM=3
DEFS += -DVOS_CPU_TYPE=44
endififeq ($(CPU_INSX),ARM64)
DEFS += -DVOS_OS_VER=4
DEFS += -DVOS_HARDWARE_PLATFORM=3
DEFS += -DVOS_CPU_TYPE=44
endifINCLUDE += -I/usr/include

###def_pub.mak###

XS_ROOT=/home/heyongxin/xs_epoll
CPU_INSX=ARM64
PRODUCT_TYPE=PTN
SROUTER=0

###exec_app.mak###

CFLAGS += -D_REENTRANT -Wall -pedantic -Isrc -g
LIBS += -lpthread
all: $(TARGET)clean:rm -f $(TARGET) *~ */*~ */*.o$(TARGET): $(SRC_FILES) $(XS_ROOT_INC_PATH)/*$(CC) -fPIC ${CFLAGS} -o $@ $< $(INCLUDE) ${LIBS}

###xs_epoll_build.mk###

include $(XS_ROOT)/build/common_mak/def_pub.mak
include $(XS_ROOT)/build/common_mak/def_app.makXS_ROOT_SRC_PATH = $(XS_ROOT)
XS_ROOT_INC_PATH =$(XS_ROOT)/include
XSEPOLL_RELEASE_PATH =$(XS_ROOT)/binDEFS += -DAA_AAifeq ($(CPU_INSX),ptn)CFLAGS += -DBYTEORDER_LITTE
elseCFLAGS += -DBYTEORDER_BIG
endifMODULE = xs_epoll
TARGET = $(XSEPOLL_RELEASE_PATH)/$(MODULE)
MODULE_OUTPUT_PATH = $(XSEPOLL_RELEASE_PATH)/$(MODULE)
TARGET_COPY = lxs_epoll.soSRC_FILES += $(shell find $(XS_ROOT_SRC_PATH)/src -name xs_epoll.c)
#SRC_FILES += $(shell find $(XS_ROOT_SRC_PATH)/src -name xs_epoll.c)
#SRC_FILES += $(shell find $(XS_ROOT_SRC_PATH)/src -name xs_epoll.c)ifeq ($(SROUTER),1)
LIBS += -lsfeaa
DEFS += -DCPU_INSA_X86
endififdef UT_FILES
CC += -O2
endifINCLUDE += -I$(XS_ROOT)/include
#           -I$(XS_ROOT)/product/xframe/aa/include \
#           -I$(XS_ROOT)/product/xframe/aa/include \
#           -I$(XS_ROOT)/product/aa/include \include $(XS_ROOT)/build/common_mak/exec_app.mak

###build.sh###

#!/bin/bash
# testing the script
export XS_ROOT="/home/heyongxin/xs_epoll"
#./build.sh build xs_epoll all cleanfunction Main_Build_Entrance {echo $1echo $2echo $3echo $4if [[ $4 -eq "clean" ]]thenmake -f ./xs_epoll_build.mk cleanmake -f ./xs_epoll_build.mkelif [ $4 -eq "gdb" ] && [ $1 -eq "run" ]thengdb $(XS_ROOT)/bin/xs_epollelsemake -f ./xs_epoll_build.mkfi
}Main_Build_Entrance $1 $2 $3 $4
#make -f ./xs_epoll_build.mk

使用CMake构建项目

https://blog.csdn.net/dodonei/article/details/79576495

Makefile编写及一个简单的Makefile架构实现相关推荐

  1. 一个简单的makefile编写VCS仿真

    一个简单的makefile编写VCS仿真 1 VCS简介 VCS是编译型Verilog模拟器,它完全支持OVI标准的Verilog HDL语言.PLI和SDF. VCS具有行业中较高的模拟性能,其出色 ...

  2. python cs开发框架_用Python编写一个简单的CS架构后门的方法

    用Python编写一个简单的CS架构后门的方法 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  用Python编写一个简单的CS架构后门的方法.txt ] (友情 ...

  3. 一个简单的三层架构例子(.NET入门)

    最近开始学习.NET 用的是c# 目前要用三层架构的模式开发一个简单的图书管理系统,不过以为刚接触这门技术.做起来分外吃力,甚至连究竟要写些什么都不清楚. 于是乎上网到处找寻三层架构的基础入门知识,终 ...

  4. JAVA编写的一个简单的Socket实现的HTTP响应服务器

    JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了. package test.io;import java.net.*; import java.io ...

  5. 基于gulp编写的一个简单实用的前端开发环境

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  6. Qt5.9/C++架构实例(一个简单的MCV架构应用实例)

    本文主要在Qt5.9/C++桌面应用项目开发中,总结一个常用的程序架构(或框架),整个工程主要分为三大模块,分别为视图层.控制层.模型层.其中,视图层完全负责界面类的编写和展示:控制层完全负责处理逻辑 ...

  7. java自己实现linkedlist_自己根据java的LinkedList源码编写的一个简单的LinkedList实现...

    自己实现了一个简单的LinkedList /** * Create by andy on 2018-07-03 11:44 * 根据 {@link java.util.LinkedList}源码 写了 ...

  8. 一个简单的Makefile

    下面是Makefile的代码:由源文件sum.c和compare.c编译成.o文件,再链接成sum可执行文件.(在当前目录下面输入make就可执行) sum: sum.o compare.ogcc - ...

  9. 一个简单的Makefile模板

    FLAGS = -Wall -g INCLUDE=-I$(ACE_ROOT)/include ACE_LIB=-L$(ACE_ROOT)/lib N_LIB=-lACE DD=-DACE_HAS_EV ...

最新文章

  1. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
  2. sysbench性能压测以及mysql性能压测
  3. nodejs返回下载文档,文档名称出现汉字出现乱码解决
  4. jquery 设置asp:dropdownlist 选中项
  5. android 模块自动加载,Android 之ko模块的自动加载
  6. http:(4):http请求方法
  7. 神结合!一招玩转K8s和微服务治理
  8. java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码
  9. css修改图片形状,css定位图形改(原创)
  10. 乌龟吃鱼类 -python
  11. java增删改查控制台_在控制台中输入增删改查 (初学者)
  12. 791A.Bear and Big Brother
  13. C/C++ 高质量编程--内存,二重指针,指针的高级使用解析 3
  14. quartz 配置 数据源
  15. Spread 16.0 for WinForms Crack
  16. 全国大学生数学建模竞赛(建模全过程)
  17. 网络平台运行计算机终端,Terminal是什么意思?Mac如何打开终端Terminal?
  18. Adobe国际认证设计师证书含金量怎么样?
  19. GPRS模块的TCP发送数据流程
  20. HTML文字波浪形前进后退效果

热门文章

  1. 直观理解神经网络和感知机
  2. 国人九大劣根性-读书笔记
  3. 夏普LCD连接电脑问题
  4. 如何用matlab进行部分式展开_[转载]用MATLAB进行部分分式展开
  5. 小球跳跃游戏——EasyX图形库应用——C++小游戏
  6. SuspendThread、ResumeThread(二)
  7. 【USACO】Haywire
  8. [转载]OGRE 3D 1.7 Beginner‘s Guide中文版 第一章
  9. Use a dynamically-generated, random IV.
  10. 女生适合学python吗_女生适合学习Python吗?