实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)
不同文件下的多个可执行文件编译到同一目录下,这样方便观察编译结果,从而方便进程操作。使用时根据自己的需要在进行局部修改(如 链接库、目标文件等等)。
1、.bashrc 中设置编译主目录(例如)
export MKHOME=$HOME
ORACLE_HOME=/oracle/10G; export ORACLE_HOME
2、主目录中创建一个mak文件夹,文件夹中创建以下三个文件(database.mak、mkstand.mak、platform.mak):
(1)database.mak(嵌入数据库文件编译配置选项,其中libclntsh.so为数据库中的库文件)
#|----------------------------------------------------------------------------|
#| TOPMake 2.0 |
#| Copyright (c) - XXX Software Systems Co., Ltd. |
#| All Rights Reserved |
#|----------------------------------------------------------------------------|
#| FILE NAME : database.ora8.mak |
#|----------------------------------------------------------------------------| DBINCP = .
DBLIBP = -L$(ORACLE_HOME)/lib32
DBLIBS = -lclntsh
DBD =
DBDEF = -g
DBFIX = .pc
DBTYPE =
#DBCHK = sqlcheck=full userid=$(ORACLEUSERID)/$(ORACLEUSERPWD)@$(ORACLETNSNAME)
~
(2)platform.mak(编译默认选项)
#|----------------------------------------------------------------------------|
#| TOPMake 2.0 |
#| Copyright (c) - XXX Software Systems Co., Ltd. |
#| All Rights Reserved |
#|----------------------------------------------------------------------------|
#| FILE NAME : platform.mak |
#|----------------------------------------------------------------------------| SHELL = /bin/sh CC = cc
CXX = g++
DLINK = ld
SLINK = ar
DLFLG = -G
SLFLG = rv
CCFLG = -m32 -Wchar-subscripts -Wcomment -Wformat -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wfloat-equal -Wpointer-arith -Wbad-function-cast -Wcast-qual -Waggregate-return -g
CXXFLG=
EXFLG = -m32 -Wchar-subscripts -Wcomment -Wformat -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wfloat-equal -Wpointer-arith -Wbad-function-cast -Wcast-qual -Waggregate-return -g
DBFLG = -g -O0 -DPRINT_DBOPR_LOG
OPFLG = -g
DLFIX = .so
SLFIX = .a
UXLIBS = -lm
OSDEF =
OSTYPE =
(3)mkstand.mak(编译基本规则)
#|----------------------------------------------------------------------------|
#| TOPMake 2.0 |
#| Copyright (c) - XXX Software Systems Co., Ltd. |
#| All Rights Reserved |
#|----------------------------------------------------------------------------|
#| FILE NAME : mksstand.mak |
#| DESCRIPTIONS : Makefile for all kind of platform, for c and pc file, |
#| for lib(dynamic & static) and execuatable object |
#|----------------------------------------------------------------------------| include $(MKHOME)/mak/platform.mak
include $(MKHOME)/mak/database.mak # environment variables must be define outside of makefile
#
# $MKHOME : home directory of application
# $CCFLG : compiler options for c source code
# $CXXFLG : compiler options for c++ source code
# $DLFLG : link options for dynamic library NO NEED FOR DYNAMIC LIBS && OMIT
# $SLFLG : link options for static library
# $EXFLG : link options for excecuteable object
# $DBFLG : debug mode options
# $OPFLG : optimize mode options BASICALLY NO HEAVY LOAD && MAY BE OMITTED
# $DLFIX : suffix of dynamic library NO NEED FOR DYNAMIC LIBS && OMIT
# $SLFIX : suffix of static library # $OBJS : c object files list
# $LIBS : libs required for executable object
# $DEFS : define flag list
# $TARGET : target objetc name # commands PC = proc RM = rm -f
CP = cp
MV = mv
CD = cd
ECHO = @echo # paths and flags SYSINCP = /usr/include
SYSLIBP = SRCP = $(MKHOME)/src
BINP = $(MKHOME)/bin
LIBP = $(MKHOME)/lib
INCP = $(MKHOME)/incl INCPS = -I$(INCP) -I$(DBINCP)
LIBPS = -L$(LIBP) $(DBLIBP) $(DBLIBS) CCFLGS = $(RLFLG) $(CCFLG) $(DEFS) $(DBDEF) $(OSDEF) $(BITDEF) $(INCPS) $(DBFLG)
CXXFLGS = $(RLFLG) $(CXXFLG) $(DEFS) $(DBDEF) $(OSDEF) $(BITDEF) $(INCPS) $(DBFLG)
DLFLGS = $(DLFLG) $(LIBPS)
EXFLGS = $(EXFLG) $(LIBPS) SLTARG = $(LIBP)/lib$(TARGET)$(SLFIX)
EXTARG = $(BINP)/$(TARGET) debugstatic: setdebug $(SLTARG)
releasestatic: setrelease $(SLTARG)
debugexec: setdebug $(EXTARG)
releaseexec : setrelease $(EXTARG) setdebug:
$(ECHO) $(DBFLG) > $(MKHOME)/mak/.mak.tmp setrelease:
$(ECHO) $(OPFLG) > $(MKHOME)/mak/.mak.tmp $(SLTARG): $(OBJS)
$(ECHO) "Linking [$(SLTARG)] ..."
@$(SLINK) $(SLFLG) $@ $(OBJS)
@$(RM) $(MKHOME)/mak/.mak.tmp $(EXTARG): $(OBJS)
$(ECHO) "Linking [$(EXTARG)] ..."
@$(CC) -o $@ $(EXFLGS) $(OBJS) $$LIBS
@$(RM) $(MKHOME)/mak/.mak.tmp # implicit .SUFFIXES:
.SUFFIXES: .pc .c .o .cpp .pc.o:
$(ECHO) "Compiling [$@] ..."
$(PC) include=$(ORACLE_HOME)/precomp/public include=$(INCP) lines=yes iname=$*$(DBFIX) $(DBCHK)
$(CC) -o $@ `cat $(MKHOME)/mak/.mak.tmp` $(CCFLGS) -c $*.c
$(RM) $*.lis $*.c tp* .cpp.o:
$(ECHO) "Compiling [$@] ..."
@$(CD) `dirname $@` ; \
$(CXX) -o $@ `cat $(MKHOME)/mak/.mak.tmp` $(CXXFLGS) -c `basename $<` .c.o:
$(ECHO) "Compiling [$@] ..."
@$(CD) `dirname $@`; \
$(CC) -o $@ `cat $(MKHOME)/mak/.mak.tmp` $(CCFLGS) -c `basename $<` # clearing object codes cleanstatic : cleanup
@$(RM) $(SLTARG) cleanexec: cleanup
@$(RM) $(EXTARG) cleanup:
@$(RM) $(OBJS)
3、每个需要编译生成可执行的文件夹下创建makefile文件(内容如下)
#|----------------------------------------------------------------------------|
#| TOPMake 2.0 |
#| Copyright (c) - XXX Software Systems Co., Ltd. |
#| All Rights Reserved |
#|----------------------------------------------------------------------------|
#| FILE NAME : sample.exec.mak |
#| DESCRIPTIONS : Sample makefile for executable binary |
#|----------------------------------------------------------------------------| ###############################################################################
PRGOBJS1 = \
$(MKHOME)/src/XXX/XXX.o \
$(MKHOME)/src/XXX/XXX.o \
$(MKHOME)/src/XXX/XXX.o \ PRGTARG1 = XXX
PRGLIBS1 = -lTransCust -lTools -lCommon -lcm -lfnm -lDbs -lHsm
PRGDEFS1 = ###############################################################################
debug all: debugstatic debugexec
release: releasestatic releaseexec
clean: cleanstatic cleanexec ##STATIC LIB
releasestatic debugstatic cleanstatic: ##EXECUTABLE BIN
releaseexec debugexec cleanexec:
@make -f $(MKHOME)/mak/mkstand.mak $@ TARGET="$(PRGTARG1)" OBJS="$(PRGOBJS1)" LIBS="$(PRGLIBS1)" DEFS="$(PRGDEFS1)"
4、执行make可执行文件会生成在(BINP = $(MKHOME)/bin)所指定目录下 O(∩_∩)O~
5、静态库生成需要编译的文件夹下创建makefile文件和可执行文件略有不同(make一行写在 ##STATIC LIB下,有时不需要链接其他库 PRGLIBS1)如下:
#|----------------------------------------------------------------------------|
#| TOPMake 2.0 |
#| Copyright (c) - XXX Software Systems Co., Ltd. |
#| All Rights Reserved |
#|----------------------------------------------------------------------------|
#| FILE NAME : sample.staticlib.mak |
#| DESCRIPTIONS : Sample makefile for static library |
#|----------------------------------------------------------------------------| ###############################################################################
PRGOBJS1 = \
$(MKHOME)/src/Tools/xxx.o \
$(MKHOME)/src/Tools/xxx.o \
$(MKHOME)/src/Tools/xxx.o PRGTARG1 = Tools
PRGDEFS1 = ###############################################################################
debug all: debugstatic debugexec
release: releasestatic releaseexec
clean: cleanstatic cleanexec ##STATIC LIB
releasestatic debugstatic cleanstatic:
@make -f $(MKHOME)/mak/mkstand.mak $@ TARGET="$(PRGTARG1)" OBJS="$(PRGOBJS1)" LIBS="$(PRGLIBS1)" DEFS="$(PRGDEFS1)" ##EXECUTABLE BIN
releaseexec debugexec cleanexec:
6、执行make静态库会生成在(BINP = $(MKHOME)/lib)所指定目录下 O(∩_∩)O~
实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)的更多相关文章
- Linux编译Windows共享目录下代码
Linux编译Windows共享目录下代码(金庆的专栏)万神服务器代码是跨平台的.平时策划在Windows上开自己的服务器测试,测试和发布服务器为Linux.开发时,先在Windows上编译测试,再到 ...
- linux下的C语言开发(静态库/动态库)
动态链接库不是Linux独有的特性,在windows下面也存在这样的特性.一般来说,windows下面的动态连接库是以*.dll作为结尾的,而linux下面的动态连接库是以*.so结尾的.和静态链接库 ...
- Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包
- [ffmpeg 扩展第三方库编译系列] frei0r mingw32 下编译问题
在编译安装frei0r的时候遇到两个错误地方, 两个都是在install的时候. 一开始编译都很顺利,输入了 make install之后就走开了,回来一看,报错误. 提示mkdir -p //usr ...
- [ffmpeg 扩展第三方库编译系列] 关于 mingw32 下编译libcaca
在编译前最好先看一下帮助 ./configure --help 开始编译 ./configure --disable-shared --disable-cxx \ --disable-csharp ...
- eclipse中多个工程编译到同一个目录下
1.点击link source 2.选择Java(ps:Java文件目录)或者resource(ps:配置文件目录) 3.最后结果,然后使用project中的clean进行编译,就可以把两个工程编 ...
- autotools源文件相同/不同目录下
关于Autotools 我们前面的章节中已经讲到了Makefile的使用(点击进入查看文章).我们知道在Linux下面如果编译一个比较大型的项目,我们可以通过Makefile的方式来完成. 但是,我们 ...
- Makefile.am文件配置
Makefile.am Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./ ...
- Makefile.am文件的实例讲解
Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候 ...
随机推荐
- Xpath定位_1:子找父以及contains的用法
先上xml代码,如下图,在写自动化脚本时,需要定位到数字为10334的td元素.td元素的父元素.父的父元素以及属性值都一样:只有同胞元素的元素值不同.以此可以通过先定位到同胞元素,在找到父元素下的期 ...
- IOS 录音(AVAudioRecorder)
#import "HMViewController.h" #import <AVFoundation/AVFoundation.h> @interface HMView ...
- [18/11/26] this关键字、static关键字和静态块(及语句块)
1.this关键字 this的本质就是“创建好的对象的地址”! 由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表“当前对象” [用法] 1. 在程序中产生二义性之处 ...
- 【洛谷P1978】 集合
集合 题目链接 显然,我们是要把数据先排序的, 然后从大到小枚举每个数,看是否能选上, 能选就选,不能拉倒 若能,二分查找a[i]/k,若查找成功,ans++ 将a[i]/k标记为不能选择 最后输出答 ...
- Python—XML
什么是xml XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被 ...
- LeetCode10.正则表达式匹配 JavaScript
给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...
- css的基础用法(上)
css定义: CSS层叠式样表(Cascading Style Sheets)是一种用来表现html或xml等文件样式的计算机语言.CSS不仅可以静态的修饰网页,还可以配合各种脚本语言动态地对网页个 ...
- rm -f + 文件名+* 与 rm -f + 文件名* 的不同效果,大坑呀。
rm -f catalina.2018-10-22.* 与*号间无空格 rm -f catalina.2018-10-22. * :多了空格:
- python查找目录及子目录下特定文件
写这篇博客的缘由: 面试归来翻脉脉发现一个陌生的朋友提出一个面试题,设计实现遍历目录及子目录,抓取.pyc文件. 并贴出两种实现方法: 个人感觉,这两种方法中规中矩,不像是python的风格.pyth ...
- Windows下远程桌面的连接
[系统环境] 建议Windows7以上 [步骤说明] 1.使用"WIN + R"组合键打开"运行"对话框,然后输入“mstsc”,点击确定,如下图所示: 2.点 ...