一、-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区别

gcc的-g,-o,-c,-D,-w,-W,-Wall,-O3等参数的意义相关推荐

  1. 区别gcc中的-w -W和-Wall选项

    区别gcc中的-w -W和-Wall选项 man 举例: man -w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告 ...

  2. gcc中的-w -W和-Wall选项

    今天在看一个makefile时看到了gcc -W -Wall....这句,不明其理,专门查看了gcc的使用手册. -w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后 ...

  3. gcc选项-g与-rdynamic的异同

    gcc 的 -g ,应该没有人不知道它是一个调试选项,因此在一般需要进行程序调试的场景下,我们都会加上该选项,并且根据调试工具的不同,还能直接选择更有针对性的说明,比如 -ggdb .-g是一个编译选 ...

  4. 【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍

    目录 一.yum 1.了解yum (1)RPM (2)yum 2.yum使用 (1)查看软件包 (2)安装软件 (3)卸载软件 二.Linux编辑器-vim 1. vim概念 (1)命令模式 (2)插 ...

  5. gcc或g++的编译选项 -shared -fPIC 与 -g -rdynamic 部分转载

    动态库 Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来.使用动态 ...

  6. gcc、g++、MingW、MSVC、make、CMake的关系

    索引指南 老生常谈 GNU的GCC/G++ Windows的Mingw/MSVC LLVM的clang/clang++ Make/CMake 经常在编程环境配置中遇到诸如GNU的gcc/g++.LLV ...

  7. JavaScript中 var reEmail=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; //邮箱检测

    正则表达式 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* \w任意大小写英文字母 0-9数字 下划线  +为至少出现1个以上字符 [-+.]\w+   任意包 ...

  8. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  9. gcc和g++是什么,有什么区别?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 机器算法学习那些事 目前(2020-09)GCC 编译器已经更新至 ...

最新文章

  1. 数据不能产生价值都是耍流氓
  2. 列名无效怎么解决_电脑win键失效怎么办? 键盘win键无效的解决办法
  3. SQL Server blocking session
  4. android 集成同一interface不同泛型_【Java视频教程】day30-泛型??
  5. [软技能] png-8和png-24有什么区别?
  6. 计算机课伤害事故的防范,体育课安全伤害事故的防范与处理
  7. Vue中引入css文件
  8. Python 读取文本文件编码错误解决方案(未知文本文件编码情况下解决方案)
  9. PHP 报错 Resource temporarily unavailable 无法删除上传的资源
  10. 计算机组成部件及其作用,计算机硬件组成成分各自的功能 计算机硬件有哪几部分组成?请分别说明各部分的作用?...
  11. 国际标准化比率 INR
  12. 拼多多校招的三道笔试题
  13. javafx小球运动
  14. 最新苹果服务器认证,Sign in with Apple-苹果登录(客户端和服务端)
  15. thinkphp6 使用PhpOffice导入Excel表格(上传文件)
  16. 为整数线性规划(integer linear programming,ILP)
  17. Permission denied: user=dr.who, access=WRITE, inode=“/“:root:supergroup:drwxr-xr-x
  18. shell统计网卡流量
  19. Word删除关键字所在行
  20. 工行接口对接(开户H5、SFTP文件对帐、e支付H5、e支付回调等)

热门文章

  1. 大声地说:我爱学习!从写作业开始。
  2. 云栖科技评论第71期:数字经济时代,需要“新大脑”
  3. diea显示左边的项目结构 idea显示右边的maven图标和batabase图标
  4. 论文那些事—The Limitations of Deep Learningin Adversarial Settings
  5. 瑞士军刀 netcat
  6. 第六章代码的可维护性——可维护性的度量和构造原则
  7. Arduino教程-09.L298N控制直流电机(避障小车)
  8. Mingw编译带lib的c代码出现cannot find 错误的解决
  9. 【练习二】选择结构(if、switch)相关练习
  10. 短消息发送7Bit AscII编码符号的问题