原文:http://www.blogjava.net/canvas/articles/quick_makefile.html
几个简单适合小程序的Makefile,可直接拷贝使用,自己mark一下,这样长时间不用Makefile也不用去看手册了

0.只有一个文件

# 变量的定义,方便使用
CC      = gcc
CCFLAGS = -O2 -s
BIN     = test
OBJ     = root_password_tool_win32.o

$(BIN) : $(OBJ)
    $(CC) $(CCFLAGS) -o test $(OBJ)

$(OBJ) : root_password_tool_win32.c
    $(CC) $(CCFLAGS) -c root_password_tool_win32.c

.PHONY : clean
clean :
    -rm $(BIN) $(OBJ)

1.简单编译命令行程序,$(CC)前面是tab,不是space

一共五个文件:
test.c
md5.c md5.h
password.c password.h

main函数在test.c中,test.c文件include了md5.h和password.h

CC      = gcc
CCFLAGS = -O2 -s
BIN     = password
OBJ     = md5.o password.o test.o

$(BIN) : $(OBJ)
    $(CC) $(CCFLAGS) -o password $(OBJ)

md5.o : md5.c md5.h
    $(CC) $(CCFLAGS) -c md5.c

password.o : password.c password.h
    $(CC) $(CCFLAGS) -c password.c

test.o : test.c
    $(CC) $(CCFLAGS) -c test.c

.PHONY : clean
clean :
    -rm $(BIN) $(OBJ)

make            # 编译得到password.exe,这里在windows下cigwin+mingw环境中编译
make clean    # 清理编译生成的*.o等文件

2.使用g++编译win32程序的Makefile,其中简写了一些,可以对比1看看不同之处
说明:
    (0)指定静态库目录,连接静态库libcomctl32.a编译程序
    (1)编译windows资源文件(使用mingw的windres)
    (2)使用-mwindows编译选项去除弹出的cmd窗口

CC      = g++

# -O2       : optimization option
# -s        : build small binary
# -mwindows : use this option to remove the popping cmd window
CCFLAGS = -O2 -s -mwindows
BIN     = test
WINDRES = windres
RES     = resource.o
OBJ     = main.o md5.o password.o $(RES)

# where is your mingw library?
LIBPATH = 'C:\Program Files\CodeBlocks\MinGW\lib\'

LIBS=-L$(LIBPATH) -lcomctl32

RM      = -rm

$(BIN): $(OBJ)
    $(CC) $(CCFLAGS) -o $(BIN) $(OBJ) $(LIBS)

main.o: main.cpp

md5.o: md5.cpp md5.h

password.o: password.cpp password.h

# 编译资源文件
$(RES): resource.rc rpt.ico manifest
    $(WINDRES) -o $(RES) resource.rc

.PHONY:clean
clean:
    $(RM) $(BIN) $(OBJ)

3.编译静态库
其中一些$<,$^, $@是Makefile的自动化变量,详细了解可以看《跟我一起写Makefile》的第五章

CC            = g++

OBJS         = utp.o utp_utils.o

# -g : for debug
CFLAGS        = -g -O2 -Wall -DPOSIX
TARGET        = libutp.a

.cpp.o:
    $(CC) -c $(CFLAGS) $<
    
all: $(TARGET)

libutp.a: $(OBJS)
    ar cru $@ $^
    ranlib $@
    
.PHONY : clean
clean :
    -rm *.o $(TARGET)

4.编译动态库
(0)windows下使用mingw编译dll动态库

CC      = g++
OBJS    = utp.o utp_utils.o
CCFLAGS = -fno-exceptions -fno-rtti -Wall -g -lwsock
TARGET  = libutp.dll

all: $(TARGET)

$(TARGET): $(OBJS)
    -rm -f $(TARGET)
    $(CC) -shared -o $(TARGET) $(OBJS) -lws2_32

.cpp.o:
    $(CC) -c -DPOSIX -fpic -I . -I utp_config_lib $(CCFLAGS) $<

.PHONY: clean
clean:
    -rm -f $(OBJS) $(TARGET)

(1)linux下编译so动态库

CC      = g++
OBJS    = utp.o utp_utils.o
CCFLAGS = -fno-exceptions -fno-rtti -Wall -g
TARGET  = libutp.so

all: $(TARGET)

$(TARGET): $(OBJS)
    -rm -f $(TARGET)
    g++ -shared -o $(TARGET) $(OBJS)

.cpp.o:
    g++ -c -DPOSIX -fpic -I . -I utp_config_lib $(CCFLAGS) $<

.PHONY: clean
clean:
    -rm -f $(OBJS) CCFLAGS

5.编译多个目标,0-2均是编译单个目标
(0) 添加头文件目录
(1) 使用自己编译的静态库libutp.a

CC          = g++ 
CFLAGS      = -g
LIBUTP_PATH = /home/actiontec/workspace/code_reading/third_party/libutp/lib
INCLUDES    = -I${LIBUTP_PATH}
LIBS        = -L$(LIBUTP_PATH) -lutp -lpthread -lrt
TARGET      = all

all: server client

server: server.cpp
    $(CC) $(CFLAGS) -o $@ $^ $(INCLUDES) $(LIBS)

client: client.cpp
    $(CC) $(CFLAGS) -o $@ $^ $(INCLUDES) $(LIBS)

.PHONY : clean
clean:
    -rm *.o server client

以上仅供参考

makefile跨平台,动态库,静态库相关推荐

  1. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统. ...

  2. c语言makecode头文件,cmake 添加头文件目录,链接动态、静态库

    罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER| ...

  3. VS2015编译32位Opencv310(动态库+静态库,文末有下载链接)

    VS2015编译32位Opencv310(动态库+静态库 编译过得,可以直接用的: http://download.csdn.net/download/longzaihuaxia/9802510 之前 ...

  4. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  5. CMake 添加头文件目录,链接动态、静态库(添加子文件夹)

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  6. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...

    CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...

  7. linux系统应用学习(三)--- 动态库静态库

    动态库静态库 库文件:一般指第三方提供的可调用的库函数文件,库文件封存的是函数体,即.c文件里面的内容. 动态库      静态库 Windows下:        xx.dll            ...

  8. 硬核拆解动态库静态库

    [Github pages] 动态库与静态库是编程中十分常见的玩意儿,但是如此常见的东西在我真正用心去了解梳理过一遍之后才发现原来这里面有这么多的门道.本文就介绍一波 Linux 平台下,特指 GCC ...

  9. linux库--静态库、动态库

    文章目录 一.分文件编程思想 二.动态库静态库 1.概念介绍 2.静态库的制作和使用 3.动态库的制作和使用 一.分文件编程思想 好处: 分模块的编程思想 例如: 网络 a 超声波b 电机c a.功能 ...

  10. Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

    环境:Ubuntu-13.10  32位(虚拟机).gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件 ...

最新文章

  1. win10安装docker并结合Idea2018.1部署springboot项目
  2. TensorFlow 版本 1.10.0 发布
  3. PBio-2018:如何设计可预测植物表型的微生物组
  4. 图解Android Studio 2.0安装步骤
  5. Qt学习笔记之样式表
  6. raid读写速度对比_U盘读写速度哪家强?4款全金属USB3.0的U盘读写速度对比
  7. selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记
  8. B树 B+树 B*树
  9. linux系统在物流公司的z作用,【项目案例】基于RFID的智能物流仓储系统
  10. bzoj 4832 [Lydsy1704月赛]抵制克苏恩 期望dp
  11. Python向数据库表格里插入万级数据
  12. 黑鲨装机大师一键重装系统图文
  13. CORTEX:我知道你在真笑还是假笑 | 前辅助运动区的激活与对笑声传染性和真实性的感知
  14. 2019 年第 25 周 DApp 影响力排行榜 | TokenInsight
  15. linux7/centos7下源码安装nginx-1.16.1详解
  16. 大天使之剑服务器维修公告,大天使之剑————【维护】6月12日更新维护公告...
  17. Ndis网卡驱动是如何操控硬件的
  18. 怎样用PS修改图片上的数字
  19. 网站漏洞修复对DiscuzX3.4论坛总是被篡改页面
  20. Android 获取唯一Id

热门文章

  1. optparse模块
  2. 陈老师Linux内核进程管理导学
  3. 电源上的sense什么意思_冷知识:电源开关上的这两个标识有什么含义?
  4. secureCrt开启oracle
  5. spring_有关Spring缓存性能的更多信息
  6. 字节跳动_掌握Java字节码
  7. android开发字体样式,Android开发中修改程序字体的样式
  8. auot lisp 选择集处理_第64集 python机器学习:用预处理进行参数选择
  9. mysql 减小时_如何优化我的mysql和查询?!减少查询时间?
  10. 代码要想写得好,品位必须提一提!