项目构建:单目录组织的项目Makefile构建脚本

会不会写Makefile,可以从一个侧面说明一个人是否具备完成大型工程能力。因为Makefile关系到了整个工程的编译规则。(生成目标与所有文件的依赖关系,源文件的依赖关系)

静态链接库与动态链接库的编译

# 编译静态链接库, c选项表示创建,r选项表示插入/替换 
g++ -c ${SRC}
ar cr libxxx.a ${OBJ}
# 编译动态链接库,-fPIC生成位置独立的代码,动态载入,多个进程可共享
g++ -fPIC -shared -o libxxx.so ${SRC}

通用Makefile: 所有源文件在一个目录里

  • 使用变量
CC        = gcc
XX        = g++
# 编译链接选项
CFLAGS      = -Wall -O3 -g -c  
  • 使用通配符
$@  表示目标文件
$^  表示所有的依赖文件
$<  表示第一个依赖文件
  • 使用变量替换引用
OBJECTS = $(SOURCES:.c=.o)
  • 使用内置函数
wildcard : 扩展通配符
notdir : 去除路径
patsubst :替换通配符

For Example:

文件列表

/src
    Makefile
    sort.c
    sort.h
    test_sort.c

Makefile

CC      = gcc
XX      = g++

# 编译链接选项
CFLAGS    = -Wall -O3 -g -c  
INCLUDES    = -I.
LDFLAGS  = 

# 源文件列表
SOURCES     = $(wildcard *.c *.cpp)
# 目标文件列表
OBJECTS     = $(SOURCES:.c=.o)
# OBJECTS       = $(patsubst %.c,%.o,$(patsubst,%.cpp,%.o))
# 可执行文件名
TARGET      = test_sort

all: $(TARGET) 
# 生成可执行文件(链接)
$(TARGET): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@
# 生成目标文件(编译)
%.o: %.c
    $(XX) $(CFLAGS) $(INCLUDES) $< -o $@
.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDES) $< -o $@

# 辅助命令:清除目标文件、清除所有生成文件、运行可执行程序
.PHONY: clean cleanall run
clean:
    rm -rf $(OBJECTS)

cleanall:
    rm -rf $(OBJECTS) $(TARGET)
run:
    ./$(TARGET)

通用Makefile: 源文件分散在不同目录里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 10,148评论 0 17
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,750评论 9 468
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,293评论 19 139
  • makefile关系到整个工程的编译规则,一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干的目录当中,...
    Joe_HUST阅读 5,849评论 0 3
  • 龚鼎孳《上巳将过金陵》原诗、注释、翻译、赏析 【原文】:上巳将过金陵龚鼎孳倚槛春愁玉树飘,空江铁锁野烟消。兴怀何限...
    xcy无名阅读 2,948评论 0 0