1.目录
系统软件:/usr/bin
管理添加新软件:/usr/local/bin
保留:/usr/local
C头文件:/usr/include
依赖linux头文件:/usr/include/sys /usr/include/linux
库文件(预先编译好的函数集合): /lib /usr/lib
静态库:libX.a (档案archive 直接使用) 可以用ar命令建立。 缺点:每个程序一份拷贝。-->程序文件有拷贝,内存有拷贝。
共享库:libX.ao.N X=名字 N=版本
2.linux c 程序
编辑vim
编译gcc
项目管理makefile (在里面调用gcc)
编译链接make
调试跟踪gdb
3.gcc编译器
2.1 编译过程 eg: gcc hello.c -o hello
A 预处理: 展开宏;插入include语句内容 gcc -E hello.c -o hello.i
B 编译 : 调用ccl
C 汇编 :as ---》目标代码 gcc -c hello.i -o hello.o
D 链接 :ld --》目标代码链接成一个可执行程序 gcc hello.o -o hello
tip -i 引入其他目录头文件
eg: gcc abc.c -i /usr/abc/include //gcc会从/usr/abc/include 与标准安装目录寻找 include ""
tip -i 引入其他目录库文件
eg: gcc abc..c -L /usr/xxx/lib -lmarry //gcc 会找 libmarry.so (- l选项)
tip 多用grep寻找函数、常量定义
eg: grep TMP *.h //从当前目录的所有.h文件里面找TMP的行
tip:加速。 gcc编译过程有3份临时文件,使用-pipe管道可以舍弃临时文件,从而加速(大项目有用)
eg:gcc -pipe abc.c -o abc
tip:程序记时: time ./abc
4.gdb 调试器
gcc 生成调试信息:gcc -g test.c -o test
gdb test
待续
5.makefile 编译脚本
5.1:自动化编译,增量编译
hello.exe: main.o a.o b.o
gcc -o hello.exe main.o a.o b.o
main.o:main.c a.h b.h
gcc -c main.c
a.o:a.c a.h
gcc -c a.c
b.o:b.c b.h
gcc -c b.c
clean:
rm main.o a.o b.o #使用make clean 执行,后面实际上是shell
5.2变量:(依赖项多,或者可变性大时好用)
var = main.o a.o b.o
hello.exe:$(var)
gcc -o hello.exe $(var)
5.3自动推导:.c与 gcc-c
简化:
var = main.o a.o b.o
hello.exe:$(var)
gcc -o hello.exe $(var)
main.o: a.h b.h
a.o:a.h
b.o: b.h
clean:
rm hello.exe $(var)
#clean优化:
.PHONY:clean #.PHONY 说明后面的是伪目标(不会引起与其他文件同名问题)
clean:
-rm hello.exe $(var) #-rm 不理睬rm异常
make -f make.linux #指定使用文件
include foo.make *.mk #引用其他makefile -include 没有引用成功也继续
VPATH= DIRA:DIRB #特殊变量,当前目录没就去VPATH找
vpath %.h DIRA:DIRB #顺序从DIRA,DIRB中找所有.h文件,注意这里通配符为%
5.5 执行步骤
A
1.读入所有makefile(命令,环境变量MAKEFILES(不推荐))
2.读入include mk
3.初始化变量
4.隐式规则
5为目标文件建立依赖关系链
B
6.根据5决定哪些目标要重新生成
7.执行