Makefile小结

7 篇文章 0 订阅
3 篇文章 0 订阅

一、基础知识介绍
首先.h .c .cpp---->.i
其次.i—>.S
再是.S—>.o
这是分步解析GCC编译过程:hello.c ----->hello.i----->hello.S------>hello.o----->hello
编译单个程序时可以gcc -c 来进行编译,但是多个文件就发现并不能编译,所以就发现有makefile这个东西,他可以编译一个完整的项目。
二、Makefile的设计
1)显式规则

target:dep
	command 
目标文件:依赖文件
	命令

2)变量

obj=
普通变量赋值
obj:=
覆盖之前的值
obj?=
如果没有被赋值过就赋予等号后面的值
obj+=
追加变量

辨析:

x = foo
y = $(x) bar
x = xyz
y的值将会是 xyz bar ,而不是 foo bar 。
x := foo
y := $(x) bar
x := xyz
y的值将会是 foo bar ,而不是 xyz bar 了。

3)通配符

%   *  ?
% 任意一个
? 匹配
*所有
 例子:%.c  *.c
$@: 代表目标文件
$^: 代表依赖文件
$<: 代表第一个依赖文件 

4)函数

$(函数名 参数1  参数2 参数3 参数4)

5)编译连接过程

.c+.h-->.i-->.s--->.o---elf 

6)错误

No such file or directory #include <curses.h> 
apt-get install libncurses5-dev libncursesw5-dev

7)实例

hello:hello.o
	gcc hello.o -o hello
hello.i:hello.c
	gcc -E hello.c -o hello.i 
hello.s:hello.i
	gcc -S hello.i -o hello.s
hello.o:hello.s
	gcc -c hello.s -o hello.o

8)伪目标
伪目标

.PHONY:

9)多层目录下的makefile

CROSS_COMPILE = arm-linux-
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm

STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump

export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP

CFLAGS = -Wall -Werror -O2 -g
CFLAGS += -I $(shell pwd)/include

LDFLAGS := -lm -lfreetype -lts -lpthread -ljpeg

export CFLAGS LDFLAGS

TOPDIR := $(shell pwd)
export TOPDIR

TARGET := digitpic


obj-y += main.o
obj-y += display/
obj-y += encoding/
obj-y += fonts/
obj-y += input/
obj-y += debug/
obj-y += render/
obj-y += page/
obj-y += file/

all : 
	make -C ./ -f $(TOPDIR)/Makefile.build
	$(CC) $(LDFLAGS) -o $(TARGET) built-in.o


clean:
	rm -f $(shell find -name "*.o")
	rm -f $(TARGET)

distclean:
	rm -f $(shell find -name "*.o")
	rm -f $(shell find -name "*.d")
	rm -f $(TARGET)

10)CMake的使用
实习的时候接触到了CMake,感觉很方便,简洁,但是我感觉我用得多了makefile就忘了,所以写完CMake都会看一下makefile,
1、cmake版本说明

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)//version要大写,我小写报错了

2、项目名字

PROJECT(main)//名字好像是随便起

3、设置编译环境

set(CMAKE_CXX_STANDARD 11)

4、生成可执行文件

add_executable(async_demo ./async_demo.c)

5、添加依赖的库

target_link_libraries(async_demo nanomsg)

结束,这是最简单的一个版本,还有其他很多命令慢慢再添加
例子

project(nanonsg)
cmake_minimum_required(VERSION 2.6)
set(gcc)
add_executable(async_demo ./async_demo.c)
target_link_libraries(async_demo nanomsg)

add_executable(device_demo ./device_demo.c)
target_link_libraries(device_demo nanomsg)

add_executable(pthread_demo ./pthread_demo.c)
target_link_libraries(pthread_demo nanomsg pthread)

add_executable(pubsub_demo ./pubsub_demo.c)
target_link_libraries(pubsub_demo nanomsg)

add_executable(rpc_demo ./rpc_demo.c)
target_link_libraries(rpc_demo nanomsg)

这是编译nanomsg的CMake文件,文件名为CMakelists.txt

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值