【Linux】开发工具

目录

  • Linux编译器-gcc/g++使用
    • 执行命令:
    • 我们的.o和库是如何链接的?
  • make/Makefile
    • 依赖关系、依赖方法

Linux编译器-gcc/g++使用

gcc只能编译c语言,g++可以编译c语言也可以编译g++
背景知识:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

用vim写出代码后gcc运行

【Linux】开发工具_第1张图片

如果代码编译错误,会有语法提示:

【Linux】开发工具_第2张图片

代码编译成功后会产生一个可执行程序:

在这里插入图片描述


执行命令:

gcc 【文件名】:不加任何选项默认生成可执行程序
【Linux】开发工具_第3张图片


推荐写法:gcc 【源文件名】 -o 【自定义可执行程序名称】gcc -o【自定义可执行程序名称】【源文件名】:生成可执行程序并且可以自定义可执行程序名称,

-o的作用是将生成的可执行程序放到【自定义可执行程序名称】这个文件里去
【Linux】开发工具_第4张图片
在这里插入图片描述


gcc -E 【源文件名】-o【自定义可执行程序名称.i】:只进行预处理,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,

-E的作用是告诉gcc,从现在开始进行程序的翻译,将预处理工作做完就停下来,不要往后走了!

【Linux】开发工具_第5张图片


gcc -S 【源文件名】-o【自定义可执行程序名称.s】:进行程序的翻译,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,

-S的作用是告诉gcc,从现在开始进行程序的翻译,将编译工作做完,就停下来!

在这里插入图片描述


gcc -c 【源文件名】-o【自定义可执行程序名称.o】:进行程序的翻译,将预处理之后的结果放到【自定义可执行程序名称】这个文件里去,

-c的作用是告诉gcc,从现在开始进行程序的翻译,将汇编工作做完,就停下来!

.==o文件–》==可重定位目标二进制文件,简称目标文件,.obj文件不可以独立执行,虽然已经是二进制了需要经过 链接 才能执行
【Linux】开发工具_第6张图片

我们的.o和库是如何链接的?

1.动态链接
2.静态链接

库给我们提供方法的实现,方法的实现就是在库当中!
库其实就是把源文件(.C),经过一定的翻译,然后打包 – 只给你提供一个文件即可,不用给你提供太多的源文件,也可以达到隐藏源文件的目的。


在Linux中,编译形成可执行程序,默认采用的就是动态链接 – 提供动态库
查看是否使用动态库的指令ldd
在这里插入图片描述
查看是动态库还是静态库的指令file

在Linux中,如果要按照静态链接的方式,进行形成可执行程序,需要添加-static选项 – 提供静态库:gcc mycode.c -o 【自定义文件名】 -static
【Linux】开发工具_第7张图片

Linux中是没有安装静态库的,需要自己安装
C语言:sudo yum install -y glibcstatic
C++: sudo yum install -ylibstdc++-static

动态库因为是共享库,有效的节省资源(磁盘空间,内存空间,网络空间等)[优]
动态库一旦缺失,导致各个程序都无法运行[缺点]
静态库,不依赖库,程序可以独立运行[优点],
体积大,比较消耗资源[缺]

【Linux】开发工具_第8张图片
【Linux】开发工具_第9张图片

make/Makefile

make是一个命令
makefile是一个文件,当前目录下的文件

依赖关系、依赖方法

【Linux】开发工具_第10张图片

【Linux】开发工具_第11张图片
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译!(在文件内容和属性没有被修改的情况下,一般只会编译1次):
【Linux】开发工具_第12张图片

一定是源文件形成可执行,现有源文件,才有可执行,一般而言,源文件的最近修改时间 比 可执行文件要老的
如果我们更改了源文件,历史上曾经还有可执行,那么源文件的最近修改时间,一定要比可执行程序要新!

只需要比较,可执行程序的最近修改时间 和 源文件的最近修改时间
.exe 新于 .c 源文件是老的,不需要重新编译
.exe 老于 .c 源文件是老的,需要重新编译

查看文件的时间的指令stat 【文件】Modify:文件内容,Change:文件属性)
【Linux】开发工具_第13张图片

如果想要一直被执行:.PHONY(伪目标)

【Linux】开发工具_第14张图片
【Linux】开发工具_第15张图片


特殊符号:$@ $^
【Linux】开发工具_第16张图片


你可能感兴趣的:(Linux,linux,运维,服务器)