gcc编译过程
hello.c->hello.i->hello.s->hello.o
1.预处理 :宏替换,展开头文件,替换条件编译,删除注释
gcc -E hello.c -o hello.i
2.编译:检查语法规范
gcc -S hello.i -o hello.s
3.汇编:编译成机器指令
gcc -c hello.s -o hello.o
4.连接
gcc hello.c -o hello
交叉编译
arm-linux-gnueabihf-gcc hello.c -o arm-hello
/bin /usr/bin /usr/local/bin 的区别
- /bin 是所有用户都可以访问并执行的可执行程序。包括超级用户及一般用户。
- /usr/bin 是系统安装时自带的一些可执行程序。即系统程序,轻易不要去动里面的东西,容易入坑。
- /usr/local/bin 是用户自行编译安装时默认的可执行程序的安装位置,这个不小心误删点什么,不会影响大局。
————————————————
版权声明:本文为CSDN博主「鱼月半」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_31788709/article/details/90679657
shell命令
man //查看帮助文档
e.g.
man man
man 3 printf
man cd
cd --help //另一种查看帮助文档的方法
cd
pwd
mkdir rmdir touch rm rm -rf directory //递归删除目录
mkdir -p a/b/c //创建多层目录
mv filename filename //文件重命名
cp filename filename //复制文件
cp filename directory //复制文件到指定目录
cp -a directory directory // 复制目录
cp -r directory directory //复制目录
chmod 777 filename //修改文件权限
cat more head tail e.g. head 4 filename tail 4 filename
gedit vim
find ./ -maxdepth 4 -name “*.a”
grep “字符串” filename -n 加上-n显示所在的行 //在文件中查找字符串
sudo su
df -h //查看文件系统所占用空间
du -h //查看所使用的磁盘空间大小,会输出各个文件的使用空间
du -sh // 查看所使用的磁盘空间大小,不输出各个文件的使用空间
history
ifconfig ping //网络相关命令
clear
poweroff//关机
reboot//重启
快捷方式
!! //再次执行上一个命令
sudo !!//以sudo权限执行上一个命令
shell脚本
type cd //查看cd是否是shell的内部命令
echo $PATH//查看环境变量
//将hello.c编译成hello可执行文件后 放入 /usr/bin 目录中,就可在任何地方隐性hello。
//即将hello变成shell命令
showmount -e //查看共享文件夹
sudo apt update
sudo apt install …
errno -l //打印出所有错误码
makefile命令
- make //运行makefile
- make clean //运行伪命令
- make -f makefile_my //运行不是以makefile或Makefile命名的makefile文件
- makefile 的书写规范
目标:依赖
Tab键 命令
PHONE:clean// 伪命令
clean: //不需要依赖可不写
rm *.o
e.g.
mp3:*.o
gcc *.c -o mp3
*.o:*.c
gcc -c *.c
.PHONE:clean
clean:
rm *.o mp3
makefile的变量
系统变量:
.PHONY:all
all:
echo "$(CC)" //cc
echo "$(AS)" // as
echo "$(MAKE)"//make
自定义变量: //note:变量都是字符串来着
- =:延时赋值
A=123
B=$(A)
A=456
.PHONY:all
all:
echo "$(B)" //输出456,变量 B 在被引用的时候才被赋值
- := ,立即赋值
A=123
B:=$(A)
A=456
.PHONY:all
all:
echo "$(B)" //输出123,变量 B 立即被赋值
- ?=, 空赋值,只有在变量为空时,才能被赋值,即只能初次赋值
A?=123
A?=234
.PHONY:all
all:
echo "$(A)"//输出123.
4. +=,追加赋值
A ?= 23
A +=56
.PHONY:all
all:
echo "$(A)"//输出 23 56 //多了个空格
自动化变量:
1.$< :第一个依赖文件
.PHONY:all
all:targeta targetb
echo "$<"
targeta:
targetb: //输出 targeta
2.$^ :全部依赖文件
.PHONY:all
all:targeta targetb
echo "$^"
targeta:
targetb: //输出 targeta targetb
3.$@:目标
.PHONY:all
all:targeta targetb
echo "$@"
targeta:
targetb: //输出 all,伪目标也是目标
变量总结
= 延时赋值
:= 立即赋值
?= 空赋值
+= 追加赋值
$< 第一个依赖文件
$^ q全部依赖文件
$@ 目标
使用
CC = gcc
TARGET = SmartHome
OBJ = *.o
$(TARGET):$(OBJ)
$(CC) $^ -o $@
$(OBJ):*.c
$(CC) -c *.c
.PHONY:cleans
cleans:
rm $(OBJ) $(TARGET)
模式匹配
1.%:匹配任意多个非空字符 //相当于 shell中的 通配符 *
%:
echo "$@"
终端输入命令
note:df作为运行的目标传给 %
使用
CC = gcc
TARGET = mp3
OBJ = main.o play.o
$(TARGET):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY:cleans
cleans:
rm $(OBJ) $(TARGET)
默认规则
.o文件默认使用.c文件进行编译,可不写.o文件的生成指令
CC = gcc
TARGET = mp3
OBJ = main.o play.o
$(TARGET):$(OBJ)
$(CC) $^ -o $@
#%.o:%.c
# $(CC) -c $^ -o $@
.PHONY:cleans
cleans:
rm $(OBJ) $(TARGET)
makefile条件分支
ifeq (var1,var2) //如果 var1等于var2 执行语句
...
else
...
endif
ifneq (var1,var2)//如果 var1不等于var2 执行语句
...
else
...
endif
makefile的常用函数
1.patsubst //模式替换函数
.PHONY:all
all:
echo "$(patsubst %.c,%.o,x.c.c bar.c)"//输出x.c.o bar.o
2.notdir //取文件名函数
.PHONY:all
all;
echo "$(notdir src/foo.c hacks)"//输出foo.c hacks 去掉了路径,输出文件名
3.wildcard//获取匹配模式文件名函数
.PHONY:all
all;
echo "$(wildcard *.c)"//输出makefile所在目录的所有.c文件 即当前目录
4.foreach//循环函数
dirs := a b c d
file := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
.PHONY:all
all:
echo ""$(file)//输出a b c d 目录下的所有文件
makefile终极应用
ARCH ?= x86
ifeq ($(ARCH),x86)
CC=gcc
else
CC=arm-linux-guneabihf-gcc
endif
TARGET=mp3 #目標
BUILD_DIR=build#存放目標的目錄 後面不嫩有空格
SCR_DIR=module1 module2 #.c文件所在目錄
INC_DIR=include #頭文件所在目錄
CFLAGS=$(patsubst %,-I%,$(INC_DIR)) #遍歷頭文件,
INCLUDES=$(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))#实现检查头文件更新
sources=$(foreach dir,$(SCR_DIR),$(wildcard $(dir)/*.c)) #找出.c文件
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(sources)))
VPATH=$(SCR_DIR) #指定源文件的搜索路径 必须要
$(BUILD_DIR)/$(TARGET):$(OBJS)
$(CC) $^ -o $@
$(BUILD_DIR)/%.o:%.c $(INCLUDES) | create_build
$(CC) -c $< -o $@ $(CFLAGS)
.PHONY:clean create_build
clean:
rm -r $(BUILD_DIR)
create_build:
mkdir -p $(BUILD_DIR)