目錄
前言
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 = [email protected]
%.o : %.c
$(CC) $(INCLUDE) $(LIBSDIR) $(LIBS) $(DEFINE) $(OPTIMIZE) -c $(CCPARA) $@ $<
.PHONY : $(PHONY)
每個文件夾下的文件需要在Makefile中添加
obj-y += haha.o