linux-gcc/g++(干货知识)

gcc/g++

linux编译器-gcc/g++    

gcc是用来编辑c语言的,g++是用来编辑c++和c语言的,因为g++底层也是gcc
//gcc file后形成可执行文件(a.out),用gcc -v查看gcc版本,太老的版本比一定能编辑
// 如果编译不通过则用  gcc file -std=c99   因为我们的版本是4.8.5有点不接受c99标准所以用std
// 当然你也可以改最后形成的可执行程序名用:    gcc file -o xxx.xxx -std=c99 他根据-o后面的形成可执行文件
// touch file.cc/file.cpp/file.c××  创建c++文件  
// g++ file.cc/file.cpp 用g++编辑  当然也可以这样 g++ file.cc -std=c++11  g++ file.cc -0 xxx.xxx -std=c++11
// gcc/g++使用的时候要求文件后缀  安装g++:yum -y install gcc-c++
// 程序的翻译过程:
// 
//            过程              gcc命令                             说明
//            预处理       gcc -E test.c -o test.i        宏替换,去注释化,头文件展开,条件编译
//            编译            gcc –S hello.i –o hello.s       将c变成汇编
//            汇编            gcc –c hello.s –o hello.o       汇编语言编译变成二进制目标文件
//            链接            gcc hello.o –o hello.xxx        形成可执行程序
// 头文件展开:是将合适所需的代码拷贝到源代码中,预处理之后头文件就没用了,ls /usr/include查看头文件-c语言库
// 条件编译就是动态的裁剪,根据你所需要的功能给你裁剪
// 在社区版和专业版之间,社区版的功能比专业版的功能上少一点,因为社区版有些功能被裁减了。少的这些功能就是通过条件编译裁剪掉的,如果没有条件编译,那针对每一个版本,厂商都需要写一份对应的代码,那在维护的时候就非常麻烦,很可能会出现对社区版的修改了,而对专业版的没改。但是有了条件编译,厂商从始至终只需要维护一份代码即可,对于社区版只要对专业版的代码进行条件编译,裁剪掉相应的功能即可。
// gcc -E test.c -o test.i   选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程,选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序
// -E选项告诉编译器只进行预处理,并将预处理结果输出到指定文件,test.c是要编译的源代码文件,-o选项指定输出文件名,test.i是预处理后的结果文件名。test.i文件不是可执行程序,它只是预处理后的C语言源代码文件
// 在linux中要真正的执行一个程序:1.权限到位-x  2.本身就是一个可执行文件   所以直接执行二进制目标文件不管用因为他不是可执行文件
// 先有语言才有相应的编译器    语言一定要有自己的标准库-例如c标准库
// 链接是什么?链接是我们的程序和库结合的过程   调用C标准库中的函数或类型需要包含相应的头文件  安装开发环境=安装c标准库+c头文件

标准库

 

// 库分为动态库和静态库:linux
//                    1.动态库后缀.so  动态链接
//                    2.静态库后缀.a   静态链接
//                    windows
//                      1.动态库后缀.dll
//                      2.静态库后缀.lib

链接

// 为什么要连接?提高开发效率   ldd命令查看文件所用的库 ldd file.xxx 或者file  file.xxx 可以看到所用的链接
// 动态链接非常依赖标准库(共享动态库),但是一旦动态库缺失,所有链接这个动态库的程序就无法执行了
// 动态库&&动态链接的优缺点:缺点:不能丢失因为所有的程序都依赖这个库   
//                         优点:节省资源因为所有的程序都依赖这个库所以只存在一份就行,动态链接库的代码在运行时才被载入内存,多个进程可以共享同一个库的实例,从而减小了内存消耗
// 在使用静态链接时我们有十个程序,每个程序都要拷贝printf的代码,那么printf的语言代码就出现了十份,十个程序都跑起来后在内存里出现十次
// 静态库&&静态链接:缺点:浪费资源
//                    优点:一旦形成与库无关
// 静态链接在编译的时候把库中的方法拷贝到自己的可执行程序中,不再关心任何库  Linux中默认是没有静态库的存在,所以需要自己安装。  
// 当你运行一个可执行文件时,操作系统会将整个可执行文件加载到内存中,并开始执行其中的代码。对于静态链接的可执行文件,所有需要的代码都已经包含在文件中,因此程序可以直接调用其中的函数,而不需要再依赖外部的库文件。
// 对于动态链接的可执行文件,操作系统需要在运行时搜索和加载相应的动态链接库文件。这些库文件通常位于系统默认的库文件路径中,例如 /usr/lib。如果库文件不存在或者版本不匹配,运行程序时可能会出现错误
// 无论是静态链接还是动态链接,当你运行一个可执行文件时,操作系统会将文件加载到内存中,并开始执行其中的代码。
// c动态库默认提供的   gcc默认形成的可执行程序,默认使用动态链接
// 变成静态链接: gcc file.c -o file.xxx -static 再用ll 可以看出文件很大
// 静态链接的可执行文件可以在不同的平台上运行,因为所有需要的代码都已经包含在可执行文件中,不再依赖外部的库文件
// 就比如下载游戏一样不仅下载游戏本体也下载相应的库

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangsir.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值