
文章目录
大家好啊,我是不一样的烟火a,今天我将要为大家讲解在Linux下超好用的编译工具——gcc/g++。文章将会为大家详细讲解gcc/g++中常用的选项和具体过程,相信看完的小伙伴都能快速掌握gcc/g++的使用。由于gcc和g++的选项和用法基本一致,所以我下面主要讲解gcc的使用,学会了gcc的使用,g++也就自然学会了。那么废话不多说,开始我们今天的内容。
查看是否安装gcc
命令:gcc -v
如果你已经安装了gcc,那么你执行完上面的命令后就可以查看当前你的gcc版本。

查看是否安装g++
命令:g++ -v

如果没有安装,请执行下面命令进行安装。
命令:sudo yum install -y gcc-c++
- CentOS 7.6or8默认匹配的gcc版本是4.8,而这个版本对刚入门的小伙伴是完全够用了。
- gcc是一个专门用来编译链接C语言的编译器,而g++是一个专门用来编译链接C++的编译器。
- 由于C++是兼容C语言的,所以你可以直接用g++来编译C语言,但是不能用gcc来编译C++,因为C语言不兼容C++。
具体可以参考我写的这几篇文章,里面很详细的讲解了预处理、编译、汇编、链接相关的重点知识
【C/C++内功心法】剖析编译链接的过程,探究源文件是如何一步步变成可执行程序,提升C/C++内功
格式: gcc [选项] [要编译的文件] [选项] [目标文件]
举例:
#include<stdio.h>
#define M 100
int main()
{
printf("M: %d\n", M);
printf("hello world1\n");
// 预处理后这些注释将会被删除
// 预处理后这些注释将会被删除
// 预处理后这些注释将会被删除
printf("hello world2\n");
// 条件编译
#ifdef DEBUG
printf("hello debug\n");
#else
printf("hello release\n");
#endif
return 0;
}
预处理指令:
命令:gcc -E test.c -o test.i
也可以这样写:
只要-o后面跟的是想要生成的目标文件的文件名即可。
命令:gcc -E -o test.i test.c
执行完上面的预处理指令后,当前路径下就会多一个test.i文件,我们进入并查看test.i文件的内容。
预处理完后头文件被展开,所以文件多了800多行代码,并且注释被删除,宏被替换,条件编译已完成。

举例:(还是以上面那个代码举例)
编译指令:
命令:gcc -S test.i -o test.s
执行完上面的编译指令后,当前路径下就会多一个test.s文件,我们进入并查看test.s文件的内容。
这时,所有的代码就已经变成了汇编指令。

举例:
汇编指令:
命令:gcc -c test.s -o test.o
执行完上面的汇编指令后,当前路径下就会多一个test.o文件(叫做可重定向目标文件),我们进入并查看test.o文件的内容。
这时,所有的代码就已经变成了二进制目标代码。

举例:
汇编指令:
命令:gcc test.o -o test
执行完上面的链接指令后,当前路径下就会多一个test文件(可执行程序),这时我们就可以运行此文件了。

提示:如果想直接生成可执行文件的话,就不用带“-E”、“-S”、“-c”这些选项,其他的不变。
举例:
命令:gcc hello.c -o hello.exe
如何查看当前可执行文件所依赖的库?
命令:ldd test
如下就是test这个可执行文件所依赖的库:

当然,我们也能查看当前所有的所有头文件:
命令:ls /usr/include

总结:

一般链接的过程,是有两种方式的:
所以函数库也就分为静态库和动态库两种:
如下所示:
命令:gcc hello.o –o hello
例如:
命令:file test
这里我们就可以看到,test这个可执行文件是64位的,并且用的是动态链接。

如何查看Linux下大部分动静态库?
命令:ls /lib64

额外补充:
| -E | 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。 |
| -S | 编译到汇编语言不进行汇编和链接。 |
| -c | 编译到目标代码。 |
| -o | 文件输出到 文件。 |
| -static | 此选项对生成的文件采用静态链接。 |
| -g | 生成调试信息。GNU 调试器可利用该信息。 |
| -shared | 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。 |
| -O0 | 不做任何优化,这是默认的编译选项。 |
| -O1 | 对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化。 |
| -O2 | 是比O1更高级的选项,进行更多的优化。gcc将执行几乎所有的不包含时间和空间折中的优化。当设置O2选项时,编译器并不进行循环打开()loop unrolling以及函数内联。与O1比较而言,O2优化增加了编译时间的基础上,提高了生成代码的执行效率。 |
| -O3 | 比O2更进一步的进行优化,-O3的优化级别最高。 |
| -w | 不生成任何警告信息。 |
| -Wall | 生成所有警告信息。 |
到这里我们gcc/g++的讲解就结束了,相信大家都能够看懂,希望大家在学习gcc/g++的期间里一定要多使用gcc/g++,这样才能更快的让自己掌握gcc/g++的使用。如果大家有什么解决不了的问题,欢迎大家评论区留言或者私信告诉我。如果感觉对自己有用的话,可以点个赞或关注鼓励一下博主,我会越做越好的,感谢各位的支持。
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/
我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+