makefile不是总用到,每次用到的时候总要重新找资料,有点麻烦(怪自己基础知识不扎实,汗)。留一个通用模板放这,方便以后使用

CC      = gcc
CXX = g++
LINK = g++
CFLAGS = -g -Wall -O2
TARGET = mk0
SRCS = $(wildcard *.cpp)
SRCS += $(wildcard *.c) CXX_OBJS = $(patsubst %.cpp, %.o, $(wildcard *.cpp))
C_OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) all:$(TARGET) $(TARGET):$(CXX_OBJS) $(C_OBJS)
$(LINK) $(CFLAGS) -o $@ $^
%.o:%.cpp
$(CXX) $(CFLAGS) -c -o $@ $<
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
.PHONY:clean
clean:
rm -rf *.o $(TARGET) $(CXX_OBJS) $(C_OBJS)

因为项目特殊性,经常c与cpp都会用到,所以简单写个这样的makefile文件

上面makefile有很大局限性,比如只能使用与所有源文件在一个目录场景。下面展示可以多个目录下源文件,以及程序使用动态库的特殊场景

CC      = gcc
CXX = g++
LINKC = gcc
LINKCXX = g++
CFLAGS = -g -Wall -O2 TOP_DIR := $(shell pwd)
SRC_DIRS := $(shell find $(TOP_DIR) -maxdepth 1 -type d)
TARGET := $(TOP_DIR)/bin/mk0 INC_PATH = -I$(TOP_DIR)/include/
LIB_PATH = -L$(TOP_DIR)/lib/
EXT_LIB = -Wl,-rpath,$(TOP_DIR)/bin/ -lcsay CXX_SRCS = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.cpp))
CXX_OBJS = $(patsubst %.cpp, %.o, $(CXX_SRCS)) C_SRCS = $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.c))
C_OBJS = $(patsubst %.c, %.o, $(C_SRCS)) all:$(TARGET) $(TARGET):$(CXX_OBJS) $(C_OBJS)
  $(shell if [ ! -d $(TOP_DIR)/bin ]; then mkdir $(TOP_DIR)/bin; fi)
ifeq ($(CXX_SRCS),)
  $(LINKC) $(LIB_PATH) $(EXT_LIB) $(CFLAGS) -o $@ $^
else
  $(LINKCXX) $(LIB_PATH) $(EXT_LIB) $(CFLAGS) -o $@ $^
endif
%.o:%.cpp
  $(CXX) $(INC_PATH) $(CFLAGS) -c -o $@ $<
%.o:%.c
  $(CC) $(INC_PATH) $(CFLAGS) -c -o $@ $< .PHONY:clean
clean:
rm -rf $(TARGET) $(CXX_OBJS) $(C_OBJS)

如上所示,代码包括了三个目录:. func0 func1目录。用到了一个动态库,因为不想把动态库放入/lib或者/usr/lib下,也不想修改LD_LIBRARY_PATH值。希望能像win下可执行文件跟dll在一起那样,所以使用了 -Wl,-rpath,$(TOP_DIR)/bin/ 指定程序运行时在当前目录下的bin目录找so库。这是一个特殊场景,不需要用到时删除 -Wl,-rpath,$(TOP_DIR)/bin/ 即可。

简单的makefile模板的更多相关文章

  1. Makefile 一点一滴(一)—— 从最简单的makefile模板写起

    我在网上先找了一个最简单的makefile. 建立一个 TestCpp 目录,简单的写几行代码,命名为“TestCpp.cpp”,然后和这个最简单的 makefile 一起扔进去: TestCpp.c ...

  2. 1、编写一个简单Makefile模板

    一.Makefile简介 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译, ...

  3. 【原创】支持同时生成多个main函数 makefile 模板

    背景: 去年做项目的时候,由于有需要编译出多个可执行文件的需求,修改了Makefile使其支持生成多个结果(编译多个含有main函数的文件),但总觉得自己的实现不够完美. 今年又遇到这样需求的时候,可 ...

  4. 简单编写Makefile

    相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...

  5. 我所使用的一个通用的Makefile模板

    话不多说,请看: 我的项目有的目录结构有: dirls/ ├── include │   └── apue.h ├── lib │   ├── error.c │   ├── error.o │   ...

  6. 一个简单的Makefile的编写【用自己的话,解释清楚这些】

    用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...

  7. Hello World 的makefile模板及其分析

    makefile模板: ifeq ($(KERNELRELEASE),) //判断KERNELRELEASE是否为空,只有执行make的当前目录为内核源代码目录时,该变量才不为空. KERNELDIR ...

  8. Csharp 简单操作Word模板文件

    原文:Csharp 简单操作Word模板文件 1.创建一个模板的Word文档  Doc1.dot 内容为: To: <Name> Sub:<Subject> Website i ...

  9. linux学习 建立静态库,动态库,写简单的makefile

    建立静态库 建立四个文件 bin(可运行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件里运行 1)gcc -c add.c //编译add.c ...

随机推荐

  1. python操作日志的封装

    前言 曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的 ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 I. Characters with Hash

    Mur loves hash algorithm, and he sometimes encrypt another one's name, and call him with that encryp ...

  3. 笔记-python-centos环境下安装配置

    笔记-python-centos环境下安装配置 1.      准备工作 环境准备 centos6.5 mini,已有python 2.6.6 下载源码包 Python官网下载Gzipped sour ...

  4. Root CA certificate:ApacheJMeterTemporaryRootCA.crt created in JMeter bin directory

    今天学习jmeter录制,在点击start之后弹出: 且在jmeter安装目录里确实生成了ApacheJMeterTemporaryRootCA.crt文件 上网查询官方文档http://120.52 ...

  5. [python] 求大神解释下 面向对象中方法和属性

    面向对象中 类方法 实例方法 类属性 实例属性该如何理解呢?

  6. 关于面试总结-SQL学生表

    前言 每次面试必考SQL,小编这几年一直吃SQ的亏,考题无非就是万年不变学生表,看起来虽然简单,真正写出来,还是有一定难度.于是决定重新整理下关于SQL的面试题,也可以帮助更多的人过SQL这一关. 作 ...

  7. day01_02.php的开发环境准备

    PHP开发环境的准备 此套课程推荐xampp,也就是Apache+Mysql+PHP 但是我自己的机器装的是wamp环境,稍微有一些不一样,但是不影响使用

  8. 【转】学习设计模式之前你必须掌握的-看懂UML类图

    UML类图是UML(unified modeling language,标准建模语言)五种图示法中静态图的一种-用来描述系统中类的静态结构,不仅定义系统中的类,表示类之间的联系如关联.依赖.聚合等,也 ...

  9. 设计模式(四)建造者模式 Builder

    Builder: <Effective Java> 第2条:遇到多个构造器参数时要考虑用构建器. 建造者模式(Builder Pattern),也称生成器模式,定义如下: 将一个复杂对象的 ...

  10. HDU——1418抱歉(平面欧拉公式)

    抱歉 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...