GUN命令
GUN: GUN’s Not Unix
gcc命令
预处理:
gcc -E *.c
g++ -E *.cpp
可以使用重定向">"导出文件,可以查看预编译后的内容
执行所有的预处理指令:
头文件引入
宏展开
预处理指令执行
#pragma
#if
编译:
gcc -c *.c 只编译
生成目标文件 (ELF文件 机器语言)
windows上是 *.obj
gcc -S *.c 生成汇编(.s文件)
链接:
gcc *.o
使用vi编辑器我们写一个.c文件
此时我们的文件夹下只有一个Hello.c的文件
使用gcc Hello.c
预处理、编译、链接一步到位,生成可执行文件 a.out
使用./a.out命令执行该文件,这里是没有加\n
导致的没有换行:
另外,如果想要指定生成文件名,可以使用-o
参数
gcc Hello.c -o Hello.exe
预处理
直接使用gcc -E Hello.c
会是内容显示在终端上
此时我们可以使用上面提到的重定向>
来让它保存到文件中gcc -E Hello.c > Hello.txt
或者使用-o
选项就可以了
编译
直接编译gcc -c Hello.c
生成目标文件Hello.o也称为ELF文件又称机器语言文件
我们这里可以使用多文档把编程使用它
然后使用gcc *.o -o demo.exe
链接他们
链接
使用库
使用现成的库:
windows上:
#include 添加头文件
#pragma comment(lib,"*.lib") 加载库
linux:
#include 添加头文件 /usr/include
加载库 链接的时候 加 -l选项 /lib /usr/lib
例如:gcc *.c -l m
自己制作静态库:
windows上:
vs 建动态库静态库工程
静态链接库:
链接的时候把源代码拿过来 在生成的可执行程序文件里边
动态链接库:
运行的时候把源代码拿过来 不在生成的可执行程序文件里边
1. 让可执行程序文件相对比较小
2. 灵活!!!
动态库缺点:
依赖库文件
制作静态库:
1. 仅编译生成目标文件
gcc -c *.c -o *.o
2. 通过目标文件生成 静态库文件
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 指定目录名
先进行编译生成 .o文件再使用ar rc lib*lib.a *.o
生成库,其中lib*lib.a
是库的命名方式,开头结尾为lib,中间则为库名,后面的.o则是上一步生成的*.o文件
生成.a文件后我们删除之前的jia.c和jia.o文件,然后我们重新链接*.o以及.a文件就可以了
自己制作动态库
制作动态库:
gcc -shared *.c -o lib*lib.so
使用动态库:
1. 使用当前文件夹下的 像使用 目标文件*.o 一样使用
gcc lib*lib.so
2. 自己做的一般保存在/opt目录下
gcc *.o -L /opt -l *lib
makefile:自动化编译脚本
cmake qmake
#注释
总目标:总目标的依赖
使用依赖生成目标的命令
分支目标:分支目标的依赖
使用依赖生成目标的命令
makefile 写好后 使用make命令即可
清理命令 :
make clean
变量 : 和shell脚本的变量一样 直接使用
取值同样用$
$@ 目标
$< 依次的依赖
% 匹配多个名字
先把makefile文件编写好
然后使用make
命令,如果没有则需要下载,ubuntu的下载命令为sudo apt install make
,然后我们就得到了编译链接完成了的test.exe
也可以加上clean清理
使用的时候只用make clean
即可
升级版,其中
$@ 目标
$< 依次的依赖
% 匹配多个名字
则原来的文件可以改写为:
执行效果不变