cmake使用教程(十)-关于file,android插件化面试

└── write.cmake

0 directories, 1 file

执行该脚本后:

➜ Stepfile git:(master) ✗ cmake -P write.cmake
➜ Stepfile git:(master) ✗ tree
.
├── test
│ └── test.txt
├── test.txt
└── write.cmake

1 directory, 3 files

前边介绍过configure_file这个命令,是用来在构建工程时替换文件内容的,注意一下区别。

文件的读取

file(READ
[OFFSET ] [LIMIT ] [HEX])

这个也比较简单: 将filename文件中的内容读取到variable总,可以指定OFFSET的值,也就是开始读取的位置,指定LISTMI的值,读取的长度,HEX是否以16进制形式读取。

file(STRINGS […])

类似于读取字符码,而不读取字节码。这个命令会将filename中的字符串读取到variable中,并且variable是一个list,每个元素保存每行的内容。二进制文件不会被读取,并且换行符会被忽略。举个例子,我们刚才写入的test.txt的文件内容是:

this is a test to wirte
this is a test to append
have tab #这个是我手动添加的

我们读取这个文件并打印结果,编写string.cmake文件如下:

file(STRINGS test.txt strings)
foreach(str IN LISTS strings)
message(STATUS ${str})
endforeach(str)

因为结果会用list保存,所以用foreach循环来查看结果:

– this is a test to wirte
– this is a test to append
– have tab

关于一些选项,用的不太多:

OPTION说明
LENGTH_MAXIMUM读取字符的最大个数
LENGTH_MINIMUM读取的字符的最少个数
LIMIT_COUNT提取的不同字符的最大数量
LIMIT_INPUT限制读取的最大字节
LIMIT_OUTPUT限制写入变量的最大字节
NEWLINE_CONSUME不忽略换行符
NO_HEX_CONVERSION不需要自动转换为16进制
REGEX提取匹配正则表达式的字符串
ENCODING重新编码UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE

文件的hash码

file( )

利用这个命令可以提取出文件的hash码

MD5,SHA1,SHA224,SHA256,SHA384,SHA512,SHA3_224,SHA3_256,SHA3_384,SHA3_512

如果看过我的bomebrew教程可应该知道,在生成formula.rb文件的时候需要填写打包好的文件的SHA256来验证下载文件的完整性,所以可以利用这个写一个简单的脚本来输出hash值,写一个简单的例子吧:

file(SHA256 test.txt hash)
message(STATUS ${hash})

– f9bb70f1a2036a73f611858d01a8fb498efc7c83568faf0c74e5a52037492702

收集文件

file(GLOB
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])
file(GLOB_RECURSE [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE ]
[…])

两个命令,首先讲一下第一个GLOB:

GLOB命令将所有匹配<globbing-expressions>(可选,假如不写,毛都匹配不到)的文件挑选出来,默认以字典顺序排序。

file(GLOB files *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

这段代码的意思是挑选出当前文件下的所有文件,然后打印:

– /Users/rangaofei/Documents/program/tutorial/Stepfile/filelist.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/hash.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/string.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test.txt
– /Users/rangaofei/Documents/program/tutorial/Stepfile/write.cmake

其实我这个文件夹下的内容如下:

.
├── filelist.cmake
├── hash.cmake
├── string.cmake
├── test
│ └── test.txt
├── test.txt
└── write.cmake

1 directory, 6 files

test是一个文件夹,但是在脚本中输出了这个文件夹。假如我们不想要这个文件夹,我们可以通过LIST_DIRECTORIES设置为false即可(默认为true),修改第一行代码如下:

file(GLOB files LIST_DIRECTORIES false *)

– /Users/rangaofei/Documents/program/tutorial/Stepfile/filelist.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/hash.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/string.cmake
– /Users/rangaofei/Documents/program/tutorial/Stepfile/test.txt
– /Users/rangaofei/Documents/program/tutorial/Stepfile/write.cmake

这次只输出了文件,而文件夹没有在里边,假如我们不需要绝对路径,只需要相对某个文件夹的路径,则可以通过设置RELATIVE的值来设置。 将文件修改如下:

set(CUR ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB files LIST_DIRECTORIES false RELATIVE ${CUR}/… *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

我们设置了CUR为当前的文件夹,然后设置相对路径为当前文件夹的上级文件夹,而我的当前文件夹名称为Stepfile,则输出会包含当前文件夹的名字+文件名字:

– Stepfile/filelist.cmake
– Stepfile/hash.cmake
– Stepfile/string.cmake
– Stepfile/test.txt
– Stepfile/write.cmake

就是这么蛋疼。还要说一下这个蛋疼的伪正则匹配,一般文件是够用的。

*.cxx - 匹配所有的cxx结尾的文件
*.vt? - 匹配所有的vta,…,vtz等文件
f[3-5].txt - 匹配f3.txt, f4.txt, f5.txt这三个文件

cmake官方不推荐使用GLOB来收集文件,因为在工程或者模块中的CMakeLists.txt文件未更改而用file搜寻的文件夹下有文件的删除或者增加,cmake构建并不会知晓,而是使用旧的list。

再来讲一下第二个,GLOB_CURSE:

这个命令是用来列出所有子文件夹中的文件和当前所有文件,具体深度多少我也不知道。用法基本同上,只是多了一个FOLLOW_SYMLINKS可选项。2.6.1版本之前对于链接的文件夹同样会列出所有的链接过去的文件夹下的文件,因为这样会引起一些麻烦,所以在以后的版本中去掉了这个属性,而是将链接当做一个文件,不会列出链接到的文件夹下的文件。假如需要列出,则添加FOLLOW_SYMLINKS参数即可。

cmake_minimum_required(VERSION 3.6)

if(POLICY CMP0009)

cmake_policy(SET CMP0009 NEW)

endif()

set(CUR ${CMAKE_CURRENT_SOURCE_DIR})
file(GLOB_RECURSE files FOLLOW_SYMLINKS LIST_DIRECTORIES true RELATIVE ${CUR}/… *)
foreach(file IN LISTS files)
message(STATUS ${file})
endforeach(file)

这段代码将会列出当前所有文件、子文件夹中的文件以及链接中的文件。

关于AUX_SOURCE_DIRECTORY

aux_source_directory(

)

注意这个命令不能用于script中,他是project命令。

寻找dir文件夹下所有的源文件,存入variable中。这个命令与之前的命令有所区别,因为它只会搜集当前设置语言的文件,cmake默认的设置语言是c/cxx,则会收集到的文件只有这些语言能识别的文件,比如在step中添加如下代码

aux_source_directory(./ SRCLIST)
foreach(file IN LISTS SRCLIST)
message(STATUS ${file})
endforeach(file)

当前目录结构如下

.
├── CMakeLists.txt
├── TutorialConfig.h.in
├── build
└── tutorial.cxx

看一下输出了什么

– ./tutorial.cxx

只有一个文件被假如list中了。

文件的操作

file(RENAME )

重命名文件或者文件夹

file(REMOVE […])
file(REMOVE_RECURSE […])

删除指定的文件,REMOVE_RECURSE则会删除文件和文件夹,假如不存在,不会抛出错误。

file(MAKE_DIRECTORY […])

递归创建文件,包括路径中的文件夹

file(RELATIVE_PATH )

计算file相对于directory的相对路径,存入variable中。类似于前边的收集文件。

file(TO_CMAKE_PATH “ ” )
file(TO_NATIVE_PATH “ ” )

在cmake路径和本地路径之间相互转换。cmake路径使用的是/

file(DOWNLOAD […])
file(UPLOAD […])

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-t4dfy9ll-1712783666269)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值