一、代码常识
写代码:
编辑器 编辑 源程序文件 *.c *.cpp *.py *.sh *.java
编译器 把源程序文件 翻译成 可执行程序文件
源程序文件 中文(自然语言) 编程语言(C C++)
翻译 --> 机器语言
调试器 断点调试
其他工具 spy++ ...俗称的编译器其实应该叫 集成开发环境IDE vs vsCode QtCreator
GNU :GNU is Not Unix
gcc g++ GDB
二、gcc命令
预处理:
gcc -E *.c
g++ -E *.cpp
gcc -E *.o -o执行所有的预处理指令中完成:
①头文件引入
②宏展开
③预处理指令执行
#pragma
#if编译:
① gcc -c *.c 只编译
生成目标文件(elf文件 机器语言)
windows上是 *.obj编译的好处:协同合作(多人同时工作 单独编译 )
②gcc -S *.c 生成汇编
逆向 :汇编 反汇编 。。。
链接:
gcc *.o
三、制作并调用静态库和动态库
1.现成的:
windows上:
#include 添加头文件 ->.h
#pragma comment(lib,"*.lib") 加载库->存放实现部分
linux:
#include 添加头文件 /usr/include
加载库 链接的时候 加 -l选项 /lib /usr/lib2.自己制作:
windows上:
vs 建动态库静态库工程Linux上:
制作静态库:
1. 仅编译生成目标文件gcc -c *.c -o *.o
2. 通过目标文件生成 静态库文件
lib名称lib的命名方式是传统,后缀记得是.a
ar rc lib*lib.a *.o
使用静态库:
1. 使用当前文件夹下的 像使用 目标文件*.o 一样使用gcc *.o lib*lib.a -o *.exe
2. 自己做的一般保存在/opt目录下
gcc *.o -L /opt -l *lib
-L 指定路径
-l 指定目录名制作动态库:(直接用源文件.c ->.so文件)
gcc -shared *.c -o lib*lib.so
使用动态库:
1. 使用当前文件夹下的 像使用 目标文件*.o 一样使用gcc lib*lib.so
2. 自己做的一般保存在/opt目录下
gcc *.o -L /opt -l *lib
例如 : math.h里的函数 sqrt
gcc *.c -l m
仅仅是#include<math.h>是相当于只有声明,即.h ----->实现部分需要-l去链接
3.优缺点分析:
静态链接库:
链接的时候把源代码拿过来 在生成的可执行程序文件里边
动态链接库:
运行的时候把源代码拿过来 不在生成的可执行程序文件里边动态库优点:
1. 让可执行程序文件相对比较小
2. 灵活!!!动态库缺点:
依赖库文件
四、makefile的基本使用(多文档编程)
1.makefile:自动化编译脚本
类: cmake qmake2.基本的格式:
①#注释
②makefile中文件内容的顺序:
总目标:总目标的依赖 使用依赖生成目标的命令 分支目标:分支目标的依赖 使用依赖生成目标的命令
3.makefile 写好后 使用make命令即可
4.清理命令 :
make clean(需要先在makefile文件中写好clean相关的指令。(见下面的案例))5.变量 :
和shell脚本的变量一样 直接使用
取值同样用$6.进阶使用
$@ 目标
$< 依次的依赖
% 匹配多个名字案例使用方法:
优化后:
五、其他操作
1. 终端命令:PS1=[^o^] 将前面的路径显示成[^o^]
2.防止头文件重复包含
#ifndef _JIA_H_
#define _JIA_H_#endif
3.在终端强行结束当前运行的命令--->ctrl+C