检查安装看是否安装了whichgccwhichg++whichgdb检查版本号gcc-version安装从网上下载一个包wget-O/etc/yum.repos.d/CentOS-Base.repohttp://镜像.aliyun.com/repo/Centos-6.repo在包里选择下载的东西yuminstallgccyuminstallg++yuminstallgdbgcc本质介绍:linux将.c文件转换成.out可执行文件->ELF格式窗口,就是转换.c文件转换为.exe可执行文件gcc:四个过程编译阶段:预编译:gcc-Efile.c-ofile.i.c文件转换为.i文件编译:gcc-S文件。i生成一个.s文件,转成汇编程序集:gcc-cmain.s生成一个.o文件,可重定位的二进制文件Linkingstage:link:gcc-onewnameoldname.o生成一个可执行文件newnamegccfile.o默认生成可执行文件a.out,因为下面的操作覆盖了上面的操作,gcc-Ename.c//获取.i文件gcc-Sname.c//获取.s文件gcc-cname.c//获取.o文件gcc-oname.c//获取.out文件常见用法:单文件gcc-ofilenameoldname.c//此时filename为.out执行文件,不是.c执行文件:编译后运行程序[root@localhost2020-3-7]#vimhello.c[root@localhost2020-3-7]#gcc-onewnamehello.c[root@localhost2020-3-7]#lshello.cnewname[root@localhost2020-3-7]#./newnamehello[root@localhost2020-3-7]#多个文件编译连接成一个.outgcc-oprojectnamemain.cfile.cfile2.c//注意:一个项目中只能有一个main函数四种进程下的不同语言在C语言和C++编译上是不同的:C语言只需要在函数前加一个下划线/C++还需要看其参数的顺序,参数个数,类型参数等,所以就有了函数重载的概念,在Java和类C语言的汇编中是不一样的。在Java的汇编过程中,有一个虚拟机的概念。该类需要gbm来读取和执行。优点是可以跨平台,本质是在不同的平台上提供。C++不需要不同的解释器,汇编指令可以直接翻译成二进制。缺点是不能跨平台,优点是速度快《程序员的自我修养》.o文件(ELF格式)o文件组成readelf-hmain.o//查看头信息ELFHeader:Magic:7f454c46020101000000000000000000....thisheader的大小:64(字节)....objdump-hmain.o//查看main.o文件的section分布:文件格式ELF64-X86-64分音:IDX名称大小VMALMA文件fileofalgn0.TEXT0000000D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000402**0内容,Alloc,Alloc,aLloc,load,0de,010Data010DataDataDataDataDataDataData040000000000000000000000000000DOUTIOCE,load,data2.BSS000000000000000000000000000000000000642**2all3.Comment000000000000000000000000000000000000000000000000000000000000000000000000642*00000000000000000000000000000000000000642*0000000000000000000000642*000000000000000000642*00000000000000000000642*00000000642*00000000642*0000内容,ReadOnly4.note.gnustack000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000来.text存储指令。data存储数据并连接重定位的二进制文件.o。汇编后会生成多个可重定位的二进制文件。多个.c/.cpp文件独立编译。在链接过程中组装在一起时,此时需要将其中一个.o文件中可能需要其他.o文件的方法重定位,调用点的标识更改为需要调用的地址so该方法可以在其他文件中使用。属于数据?data:全局变量和静态变量,而且初始化不为零?函数内部的非静态变量是gcc和g++指令的区别。gcc默认连接C库,分别编译.cpp和.c,g++默认连接C++。,两者都被编译为.cpp。它们是一样的。//如果非要用gcc编译.cpp文件,只需要用命令gccmain.cpp-omain-lstdc++添加C++库,g++与gcc命令一致,文章中的g++即可replacegccwithcommonerrorserror-undefinedsymbol:gcc编译链接时,部分文件丢失。linux下定义(实现):必须包含.c文件,所以纯.h文件会报错
