一、基础知识介绍
首先.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