[转]gcc的-g,-o,-c,-D,-w,-W,-Wall,-O3等参数的意义

news/2024/10/24 0:19:56
一、-g

-g可执行程序包含调试信息
-g为了调试用的
加个-g 是为了gdb 用,不然gdb用不到

二、-o

-o指定输出文件名
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
一般语法:
gcc filename.c -o filename
上面的意思是如果你不打 -o filename(直接gcc filename.c )
那么默认就是输出a.out.这个-o就是用来控制输出文件的。 ------用./a.out执行文件

三、-c

-c 只编译不链接
产生.o文件,就是obj文件,不产生执行文件

四、-D

其意义是添加宏定义,这个很有用。

当你想要通过宏控制你的程序,不必傻乎乎的在程序里定义,然后需要哪个版本,去修改宏。

只需要在执行gcc的时候,指定-D,后面跟宏的名称即可。

示例:

gcc test.c -o test -D OPEN_PRINTF_DEBUG

或者gcc test.c -o test -DOPEN_PRINTF_DEBUG

两者都是可以的。

五、-w

-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。

六、-W和-Wall

-W选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。

-Wall选项意思是编译后显示所有警告

七、-O3

-O是大写字母O,不是数字0哦。

意思是开启编译优化,等级为三。

八、-shared

如果想创建一个动态链接库,可以使用 gcc的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。

九、-fPIC

-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)
这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

十、-l (小写的l)参数和-L (大写的l)参数

gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录。
例1:
在这里插入图片描述例2:
在这里插入图片描述
-l(小写的l)参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?
就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了。
但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L /usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest

十一、Linux-(C/C++)动态链接库生成以及使用(libxxx.so)

编译结果:生成libmax.so

运行结果:生成可执行程序main(成功了)(这里编译使用的是相对路径)

接下来,使用绝对路径编译main(在我自己编译):

使用C++编译使用C语言提供的链接库, 编译链接出错(下面只是简单将main.c 改为main.cpp)

怎么办呢??

libmax这个库仅适合C使用,C++并不适合,如果想编译一个可以供C++使用。那么头文件(max.h)就需要改变,

需要额外增加一句:extern “C”

max.h(修改如下):

这样就解决了

但是这样有一个问题,难道每次编译都要改来改去,有没有同时适合C/C链接库的方法呢?
答案是有的,只需要改动头文件即可,使用条件编译
C++有一个宏:__cpluscplus 当用g++编译的时候,就可以识别这个宏

参考网址:

[1]gcc -g -c -o区别
[2]gcc -I -L -l区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

dubbo

一、Dubbo是什么? Dubbo是一款高性能、轻量级的Java RPC(远程过程调用)框架,主要用于实现服务的分布式调用。由阿里巴巴公司开发并开源。其核心组件主要包括服务提供者、服务消费者、注册中心、和监控中心。 什么是RPC? RPC全称为remote procedure call,即远程过程调用。…

牛顿迭代法

$x_{i+1}=x_i-\frac{f(x_i)}{f(x_i)}$1 牛顿迭代法的作用 对于单个方程\(f(x)=0\),通过不断的迭代趋近于某一个单解,最终求出答案。但也有例外,比如出现无理数、无限循环小数等特殊情况,只能趋近,也就是结果是有限的。 2 牛顿迭代法的内容 2.1 怎么迭代 设\(x_1\)为你对\(…

Docker配置Trojan代理

1、遇到的问题 在做云计算作业,使用阿里云的ECS服务器尝试使用docker拉取镜像的时候,发现一直无法从仓库拉取,更换了多个镜像源也没有解决问题,于是决定学会去配置linux的代理,记录过程。 2、安装Trojan何为Trojan? Trojans是一种加密的代理协议,全称为Trojan-GFW,是目…

为什么大部分 PHP 程序员做不了架构师?

架构师一直是 PHP 程序员中梦寐以求的职位,它可望而不可及。我想大部分的 PHP 程序员心中都有一个架构师梦,但是这个梦基本上很难实现,梦终究还是梦,这是多么痛的领悟。大家好,我是码农先森。 架构师一直是 PHP 程序员中梦寐以求的职位,它可望而不可及。我想大部分的 PHP…

10.23每日总结

上次的正课可以说给了我极大的挑战,期中考试的复杂图形化可互动增删改查系统例题我可以说是毫无头绪,而选课系统在多方援助下也算大概完成,数据库、Java语言、编程深入结合,属实是我万万没想到的难度,还需努力,加油!!!

SMMU学习这一篇就够了

前言 最近朋友圈、微信群(ARM-Trustzone-TEE-AT)掀起一阵学习SMMU的热潮,作为一名安全领域的渣渣 ,势必要蹭一蹭这个“热点”,也学习一下吧,反正早晚都要学,因为它和安全的关系还是比较大的。学习是一件长期的过程,本文就先简单理一下概念吧。 1、SMMU总结 1.1、SMMU的ti…

Linux 的系统信息命令

Linux 查看操作系统、内核、服务器架构、CPU、GPU、内存和磁盘信息等命令。Author: ACatSmiling Since: 2024-10-22操作系统信息:方式一:uname -a。uname是 "Unix Name" 的缩写,这个命令主要用于打印与系统相关的信息,-a是 uname 命令的一个选项,这个选项的作用…

一个著名的日志系统是怎么设计出来的

原文:一个著名的日志系统是怎么设计出来的1 前言 Java 帝国在诞生之初就提供了集合、线程、IO、网络等常用功能,从 C 和 C++ 领地那里吸引了大量程序员过来加盟,但是却有意无意地忽略了一个重要的功能:输出日志。 对于这一点,IO 大臣其实非常清楚,日志是个很重要的东西,…