当前位置: 首页 > news >正文

gcc/g++ 编译选项

下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 

/* helloworld.cpp */  
#include <iostream>  
int main(int argc,char *argv[])  
{  
    std::cout << "hello, world" << std::endl;  
    return(0);  
}  
程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件: 
$  g++ helloworld.cpp
编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++源代码文件。编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行: 
$ ./a.out
hello, world
更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件: 
$ g++ helloworld.cpp -o helloworld
在命令行中输入程序名可使之运行: 
$ ./helloworld
hello, world

gcc/g++ 在执行编译时,需要4步

  1.预处理,生成.i的文件[使用-E参数]

  2.将预处理后的文件不转换成汇编语言,生成文件.s[使用-S参数]

  3.有汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]

  4.连接目标代码,生成可执行程序[使用-o参数]

-Wall
    显示所有警告信息(warning all)

-g
 只是编译器,在编译的时候,产生调试信息。

-O0
-O1
-O2
-O3
 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

-Idir

  在你是用#i nclude"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如
果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
会先在你所制定的目录查找,然后再按常规的顺序去找。

-Ldir
  制定编译的时候,搜索库的路径。比如你自己的库,能用他制定目录,不然
  编译器将只在标准库的目录找。这个dir就是目录的名称。

-llibrary
  制定编译的时候使用的库
  例子用法
  gcc -lcurses hello.c
  使用ncurses库编译程式

-Wl,option
  此选项传递option给连接程式;如果option中间有逗号,就将option分成多个选项,然
后传递给会连接程式。 

  gcc编译链接动态库时,很有可能编译通过,但是执行时,找不到动态链接库,那是

  因为-L选项指定的路径只在编译时有效,编译出来的可执行文件不知道-L选项后面的值,

  当然找不到。可以用ldd <your_execute>看看是不有 ‘not found’在你链接的库后面,

  解决方法是通过-Wl,rpath=<your_lib_dir>,使得execute记住链接库的位置。

-o
  制定目标名称,缺省的时候,gcc 编译出来的文件是a.out

-rdynamic

  选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中
  (目的是能够通过使用 dlopen 来实现向后跟踪)

-fPIC 

  PIC就是position independent code

  PIC使.so文件的代码段变为真正意义上的共享。

  详见:http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

-D

  表示:#define 
  如:-DPOSGP730 等价于 #define POSGP730

 

相关文章:

  • Metro Style App 异步-简洁而不简单的异步
  • centos 7 环境变量PATH 、 cp命令、mv命令、 文档查看cat/more/less/head/tail
  • Oracle基本操作命令
  • 【Java学习笔记之三十四】超详解Java多线程基础
  • An unexpected exception has been detected in native code outside the VM
  • FFmpeg AVPacket和AVFrame区别
  • 我为什么选择Angular 2?
  • 安装OpenStack问题
  • Java 大写字母转下划线加小写字母
  • CCF 201503-3 节日
  • LVS专题-(1)LVS基本介绍
  • 杭电2054
  • 赵丽颖人生第一次演讲——我小小的英雄主义,用行动证明坚持的意义
  • zabbix snmp 监控Esxi6.0 无法开启snmp服务
  • Python[7] :Python制作json格式和shell格式的API
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • iOS 系统授权开发
  • javascript面向对象之创建对象
  • java正则表式的使用
  • java中的hashCode
  • Spring声明式事务管理之一:五大属性分析
  • VUE es6技巧写法(持续更新中~~~)
  • Vue组件定义
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 官方解决所有 npm 全局安装权限问题
  • 盘点那些不知名却常用的 Git 操作
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深度学习中的信息论知识详解
  • 项目实战-Api的解决方案
  • 原生Ajax
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define用法
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读11/100)Fast R-CNN
  • (转) Face-Resources
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .net core Swagger 过滤部分Api
  • .Net Core与存储过程(一)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 简单实现MD5
  • .net 托管代码与非托管代码
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • [.net] 如何在mail的加入正文显示图片
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [20180224]expdp query 写法问题.txt
  • [bzoj2957]楼房重建
  • [C#]DataTable常用操作总结【转】
  • [JavaScript]_[初级]_[关于forin或for...in循环语句的用法]
  • [JS]JavaScript 简介
  • [one_demo_16]直接插入排序的demo
  • [PostgreSQL的 SPI_接口函数]