8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
Makefile
Makefile 构建工具,只需通过make一句命令就可以构建一个可执行程序。相当于Maven、ANT、Gradle构建工具。
gcc是一个编译工具,Makefile是一个构建工具,Makefile中会用到gcc。
在Linux中要把test.c得到一个可执行程序,我们需要编译它,通过 gcc -c test.c 编译生成 test.o 目标文件,这个目标文件不能去执行,需要继续执行 gcc -o test test.o 得到test可执行文件 。
在Java中使用ANT得到apk:
java源文件->javac编译(相当于gcc)->class文件->通过ANT打包得到apk
在c中使用gcc得到可执行文件:
.c源文件->gcc编译->.o目标文件->链接得到二进制可执行文件
如图:
Makefile里面就是包含一系列的生成可执行程序的过程。
在很多C/C++开源项目中,configrue文件用来检查系统配置生成配置文件(这些配置文件会在接下来的Makefile文件中被使用到)
Makefile文件用来生成我们需要的动态库文件(.so)。
为什么要写Makefile文件?
1.当项目非常庞大时,让构建过程,自动化,简单
2.依赖文件比目标更新,会重建目标文件
如何编写一个Makefile
假设一个项目中有
plus.c
minus.c
multi.c
divi.c
main.c五个.c文件。
我们需要:
.c -> .o目标文件
.o -> 打包myapp,可执行文件
开始编写Makefile文件:#编写文件需要三要素
#目标,依赖,命令
#myapp目标(最终目标,第一行是最终目标)
#:后的文件,这些都是依赖
#命令TAB键开头,如何由依赖文件得到目标
#step 1(复杂繁琐)
#myapp:main.o plus.o minus.o multi.o divi.o
# gcc main.o plus.o minus.o multi.o divi.o -o myapp
#目标:main.o
#依赖:main.c
#命令:gcc -c main.c
#main.o:main.c
# gcc -c main.c
#plus.o:plus.c
# gcc -c plus.c
#minus.o:minus.c
# gcc -c minus.c
#multi.o:multi.c
# gcc -c multi.c
#divi.o:divi.c
# gcc -c divi.c
#step 2(简写)
#变量
#OBJECTS=main.o plus.o minus.o multi.o divi.o
#step 3(简单明了,最终版本)
#所有.c源文件
SOURCES=$(wildcard *.c)
#把.c后缀,替换成.o后缀即是所有.o文件
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))
myapp:$(OBJECTS)
#自动化变量 $^表示所有依赖,[email protected]
gcc $^ -o $@
#通配符
#main.o:main.c
%.o:%.c
#gcc -c main.c -o main.o
gcc -c $^ -o $@
#没有依赖
#clean清除所有的.o中间文件
#伪目标
.PHONY:clean
clean:
rm -f *.o
rm -f myapp
#---------END-------------
#Makefile中一些变量与函数的书写
#递归展开式
#可以引用还没有定义的变量,展开是引用时展开
str2=$(str1)
str1=hello
#直接展开式
#必须引用定义好了的变量,定义之后就会展开
str3 := android
str4 := $(str3)
str5 := $(str1) world
#变量的值追加
str5 += hello
#自定义函数
myfun=$2 $1
#变量等于函数的执行结构
myfun_ret=$(call myfun,20,10)
test:
@echo $(SOURCES)
@echo $(OBJECTS)
@echo $(str2)
@echo $(str4)
@echo $(str5)
@echo $(myfun_ret)
@echo $(call myfun,30,40)
Makefile文件编写完成之后直接执行make命令。
直接make,构建的是终极目标
构建非终极目标,make main.o
Android.mk
在Android.mk文件中:调用my-dir函数,返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir) 放在第一行,地址当前所在目录
include file Makefile可以引入其他的Makefile文件
include $(CLEAR_VARS) 编译模块时,清空LOCAL_MODULE等参数
LOCAL_MODULE 模块名称
LOCAL_SRC_FILES 编译需要的源文件
LOCAL_C_INCLUDES 需要的头文件
LOCAL_SHARED_LIBRARIES 编译需要的动态库