目录
前言
cat /etc/*release 查看系统版本信息
更新源文件 sudo gedit /etc/apt/sources.list
安装ssh命令 sudo apt-get install openssh
c语言编译过程:
1.预编译(生成.i文件) 命令# gcc -E -o hello.i hello.c 作用: 头文件展开和.c文件合并
2.转汇编(.s)命令# gcc -S -o hello.s hello.i 作用:
3.编译(.o)命令# gcc -C -o hello.o hello.s 作用:汇编转二进制机器命令
4.链接(elf文件) 命令# gcc -o hello.elf hello.o 作用:将若干的.o文件链接到一起
gcc命令:
-D 加debug 使用方法:gcc -DDEBUG=1 -o hello hello.c
-I 指定include文件目录,
-L 指定链接库目录 -l指定该目录下的库名称
-O 优化指令 -O1 1级优化 -O3 3级优化
-Wall 严格警告,有警告不能执行通过
debug宏定义快捷方法:
#define DEBUG(1)
#if DEBUG
#define DEBUG_LOG(fmt,args...) do {printf("[*]xxx:<%s>:" fmt "\n" \
,__func__, ##args); }while(false)
#else
#define DEBUG_LOG(...)do {}while(false)
#endif
Makefile
组成:显式规则 隐式规则 变量定义 文件指示 注释
基本格式:
目标:依赖
命令
hello.gcc:hello.c
gcc -o hello.gcc hello.c
变量: 引用方式: $(变量名)
object := hello.o haha.o
object += hehe.o
尾目标 .PHONY: 执行方式:make clean
.PHNOY:
clean:
rm -rf *.o hello.gcc
通配符 %(任意一个) *(所有) ?(匹配一个)
$@ 目标文件 $^ 依赖文件 $< 第一个依赖文件
%.o:%.c
gcc -c $^ -o $@
增加函数后的通用格式
FILESRC = $(wildcard *.c)
OBJ_DEP = $(patsubst %.c,%.o,$(FILESRC))
TARGET = hello.gcc
CC = gcc
CCFLASH = -o
LIBS = -L/usr/lib
INCLUDE = -I/usr/include
DEFINE = -DDEBUG
OPTIMIZE = -O0
$(TARGET):$(OBJ_DEP)
$(CC) $(INCLUDE) $(LIBS) $(DEFINE) $(OPTIMIZE) $(CCFLASH) $@ $^
.PHONY:
clean:
rm -rf $(object) $(TARGET)
Makefile文件执行shell脚本文件
make -c ./ f $(shell pwd)/makefile.bluid
Makefile多文件通用格式:
根目录下的Makefile
TARGET:生成的目标文件名
cc 编译器 。。。。。。
TARGET = hello
CC = gcc
CCPARA = -g -o
LD = ld
LIBSDIR = -L/usr/local
LIBS =
INCLUDE = -I$(shell pwd)/include/
DEFINE = -DDEBUG
OPTIMIZE = -O0
TOPDIR = $(shell pwd)
export CC CCPARA LD LIBSDIR LIBS INCLUDE DEFINE OPTIMIZE TOPDIR
obj-y += main.o
obj-y += tool_mode/
obj-y += agreement/
all:
make -C ./ -f $(TOPDIR)/Makefile.build
$(CC) $(INCLUDE) $(LIBSDIR) $(DEFINE) $(OPTIMIZE) -o $(TARGET) built-in.o $(LIBS)
# objcopy --only-keep-debug $(TARGET) $(TARGET).Symbols
# objcopy --strip-debug $(TARGET) $(TARGET).Release
# strip $(TARGET).Release
# rm -f $(TARGET)
clean:
rm -rf $(shell find -name "*.o")
rm -rf $(TARGET)
# rm -f $(TARGET).Symbols $(TARGET).Release
distclean:
rm -f $(shell find -name "*.o")
rm -f $(shell find -name "*.o")
rm -f $(TARGET)
# rm -f $(TARGET).Symbols $(TARGET).Release
根目录下的Makefile.build
PHONY := __build
__build:
obj-y :=
subdir-y :=
include Makefile
#obj-y: a.o b.o c/ d/
__subdir-y := $(patsubst %/,%,$(filter %/,$(obj-y)))
subdir-y += $(__subdir-y)
#c/built-in.o d/built-in.o
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)
#a.o b.o
cur_objs := $(filter-out %/, $(obj-y))
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_file))
ifneq ($(dep_files),)
include $(dep_files)
endif
PHONY += $(subdir-y)
__build : $(subdir-y) built-in.o
$(subdir-y):
make -C $@ -f $(TOPDIR)/Makefile.build
built-in.o : $(cur_objs) $(subdir_objs)
$(LD) -r -o $@ $^
dep_file = .$@.d
%.o : %.c
$(CC) $(INCLUDE) $(LIBSDIR) $(LIBS) $(DEFINE) $(OPTIMIZE) -c $(CCPARA) $@ $<
.PHONY : $(PHONY)
每个文件夹下的文件需要在Makefile中添加
obj-y += haha.o