-Git 是一种版本控制系统,是一个命令,是一种工具,有点像cmd(命令行工具)。
Github 是一个基于git实现在线代码托管的仓库,向互联网开放,企业版要收钱。
Gitlab 类似 github,一般用于在企业内搭建git私服,要自己搭环境。
Gitee 即码云,是 oschina 免费给企业用的,不用自己搭建环境,可以建立自己的私有仓库。
Git-ce 是社区版,gitlab-ee是企业版,收费的。
Repo是基于git的仓库管理工具,是一个python脚本
Repo管理很多的git仓库,可以做统一的上传等其他操作,并且可以自动化部分Andoid开发流程
编译分为4步,预处理--》编译--》汇编--》链接。.c-->.i-->.s-->.o-->可执行程序。预处理是包含文件,展开宏。编译是将c转为汇编代码,汇编是将汇编代码转为机器码,链接是将不同的机器码组合为最终程序。-c表示将文件转为.o文件,比如可以把.c转为.o,也可以吧.i转为.o,也可以吧.s转为.o,也就是会根据源文件后缀,自动识别执行。
有时候说的编译是预处理---汇编---编译---链接。
gcc -o hello hello.c可以一步到位,当然,也可以按照下面四步,依次执行。
如果有多个c文件,要编译链接为一个程序,怎么做?可以gcc -o hello hey.c hi.c,但是不好,这样如果修改了某个文件,那么所有文件都要再经过从预处理到连接整个过程,浪费时间和资源。可以将每个c文件单独编译,最后将多个.o文件链接为可执行程序。
在命令末尾加-V,可以查看详细流程
头文件,尖括号的一般是系统的,也就是在gcc编译链目录内,在预处理时编译链会到编译链目录下查找。引号包含表示在当前目录查找。如果将自己定义的头文件用尖括号包含,那么预处理时会找不到,可以在末尾加-I dir,指定目录。也可以把自己写的头文件放到编译链内对应目录。当然,最好还是直接用引号包含自己的头文件。
库
可以把.o文件转为库,有静态库和动态库。
ar crs libhello.a hello.o,将hello.o压缩为静态库libhello.a,当然多个.o也可以压缩为一个静态库。
可以把库和.o文件直接链接。gcc -o hello hello.o libhello.a
gcc -shared -o libhello.so hello.o,压缩为动态库。
gcc -o hello hello.o libhello.so,静态动态库连接方式一样,编译器都会在当前目录查找库。
而用另一种方式链接动态库,即gcc -o hello hello.o -lhello,库名前的lib和后缀.so被省略。这种连接方式,编译器默认会去编译链内的相关路径 ,可以把库文件放入编译链内部路径,也可以指定查找路径,gcc -o hello hello.o -L ./ -lhello,-L指定路径,./表示当前目录。这种方式链接的程序,运行时要指定动态库路径,先执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./指定路径,再执行程序,./hello。
NAT网卡用于虚拟机经主机访问外网,桥接网卡用于虚拟机和开发板沟通。
source insight是好用的代码编辑和阅读工具,无编译调试功能。用来阅读linux源码。
MobaXterm可以创建远程连接,比如可以远程连接ubuntu,当然,不仅如此,甚至还能创建串口连接,将开发板与主机连接,主机会自动安装驱动,在MobaXterm就可以创建串口连接,可以直接执行命令,因为刚出厂的imx6ull有内置系统。
如果将网卡比喻为身份证
插入的usb网卡代表windows(当然,windows可以有很多网卡),开发板自身有两网卡,有两个身份证,用eth0。虚拟机有两个虚拟网卡。桥接网卡用于和开发板,windows主机沟通。
usb网卡ip为192.168.5.10
ubuntu的桥接网卡(ens36)ip为192.168.5.11
开发板etn0网卡ip为192.168.5.9,注意,开发板ip可能会失效。每次应该检查。
配置完后,三个网卡可以互相ping通,经测试,没问题。
makefile
makefile文件,是对gcc命令的管理,使得更高效。内容可以如下
test:a.o b.o
gcc -o test a.o b.o
a.o:a.c
gcc -c -o a.o a.c
b.o:b.c
gcc -c -o b.o b.c
如果要将多个.c文件编译链接为一个程序,上面那样就很麻烦。可用通配符简写如下
test:a.o b.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
还可以写clean
test:a.o b.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
clean:
rm *.o test
这样直接执行make clean,当目录里有名为clean的文件时,就会认为目标文件存在,并且依赖文件不存在。就会提示已更新,可这是清除操作,怎么办,假想目标。
test:a.o b.o
gcc -o test $^
%.o:%.c
gcc -c -o $@ $<
clean:
rm *.o test
.PHONY clean
将clean定义为假想目标,执行make clean就可以了。
A=NULL
B=abc
A=NULL
B=123,C放在末尾不影响
函数foreach
函数filter和filter-out
函数wildcard,选择当前文件夹下的符合格式的文件
选择真实存在的文件
patsubst函数,替换,注意,这里替换的是file变量里的,不是真实的文件。
前面的例子,都没有包含头文件,而大多数情况,.o文件不仅要依赖于.c文件,还要依赖于.h文件,比如
a.o : a.c a.h
如果有很多呢?难道要都手动写出来?不用,按照如下方式写即可,自动生成依赖文件并添加
CFLAGS,编译选项
1-Werror将所有警告视为错误,必须解决掉。-I表示指定默认查找头文件路径,比如-Iinclude,在当前目录的include文件夹查找头文件。
关于文件IO
文件权限,666表示110-110-110即所有用户都有读取写入的权限,没有执行权限。
open函数,参数如下
文件句柄,也叫文件描述符,整型,取值在3-1023之间,其中,0,1,2被系统占用。
read函数