Linux C编程学习之开发工具1---GCC编译器
GCC简介
GCC(GNU Compiler Collection)是一套功能强大、性能优越的编程语言编译器,它是GNU计划的代表作品之一。GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操作系统的标准编译器
除了支持C,还支持C++、Java
GCC常用选项
1. 基本选项
类型 | 说明 |
-E | 预处理后即停止,不进行编译、汇编及连接 |
-S | 编译后即停止,不进行汇编及连接 |
-c | 编译或汇编源文件,但是不进行连接 |
-o file | 指定输出文件为 file |
例子:
gcc -E -o test.i test.c 将test.c 文件编辑(-E 说明预处理后即停止,不进行编译、汇编及连接),然后将预处理之后的输出输出到 test.i(通过 -o 说明)
gcc -S -o test.s test.i 将上一步的预处理得到的文件 test.i 进行编译成汇编语言的文件test.s
gcc -c test.s -o test.o 将上一步的汇编文件,编译成目标文件,但是不进行连接(所以是不能执行的)
gcc -o test test.o 将上一步编译的目标文件进行连接,生成可执行文件 test
上面的这种方式从预处理、汇编、连接一步一步走下来,但是在真实的开发环境中是一步从 .c源文件编译成可执行文件的:gcc -o test test.c
2.警告选型、
在编译程序的过程中,编译器的报错和警告信息对于程序员来说是非常重要的。GCC 包含了完整的出错检查和警告提示功能,它们可以帮助Linux 程序员尽快找出错误的或者潜在的错误代码,从而写出更加专业和优美的代码
类型 | 说明 |
-Wall | 启动所有警告信息 |
-Werror | 在发生警告时取消编译操作,即将警告看作是错误 |
-w | 禁用所有警告信息 |
例子: gcc -Wall -o test test.c 在编译test.c文件的时候显示所有的警告信息
3.优化选项
-O0:不进行优化处理
-O或者-O1:进行基本优化,这些优化在大多数情况下会使程序执行的更快
-O2:除了完成-O1级别的优化外,还要一些额外的调整工作,比如处理器指令调度等,这是GNU发布软件的默认优化级别
-O3:除了完成-O2级别的优化外,还进行循环的展开以及其他一些与处理器特性相关的优化工作
-Os:生成最小的可执行文件,主要用在嵌入式领域
一般来讲,优化的级别越高,生成的可执行文件的运行速度越快,但是消耗在编译上的时间就越长,因此在开发的时候尽量不要使用优化选项,在软件发行或者开发结束的时候才考虑对代码进行最终的优化。 建议使用-O2
这里介绍一个测试程序执行时间的命令:time 可执行文件(例如:time ./test),将会显示类似如下的信息
real 0m1.206s //总的执行时间(包括进程的调度和切换)
user 0m1.172s //用户态执行的时间
sys 0m0.018s //内核态执行的时间
4.连接器选项
头文件:主要包含函数的声明部分,不包括函数的具体定义
库文件:函数的具体实现是在库文件中完成的
静态库文件:编译链接时,静态库文件的源码全都添加到可执行文件中,运行时就直接使用,但是生成的可执行文件一般比较大(静态库文件的后缀是 .a)
动态库文件:编译链接时,动态库文件的并不将源码添加到可执行文件中,而是在程序执行时由运行时的连接文件加载动态库文件,这样就更省系统开销。(动态库文件的后缀是 .so)
类型 | 说明 |
-Idirectory | 向GCC的头文件搜索路径中添加新的目录 |
-Ldirectory | 向GCC的库文件搜索路径中添加新的目录 |
-llibrary | 提示连接程序在创建可执行文件时包含指定的库文件,例如-lm表示连接到指定的math库 |
-static | 强制使用静态链接库,因为默认是使用动态链接库的 |
-shared | 生成动态库文件 |
例子:(文件名是 test.c)
#include<stdio.h>
#include<math.h>
int main()
{
int i=1;
printf("%d\b", sin(i));
return 0;
}
使用 gcc -o test test.c 编译源代码,但是在连接程序时出现错误,所以不能正确编译
主要是因为在C语言中,默认情况下只会连接C 语言的标准库(标准库的路径是 /usr/lib/libc.so),但是 头文件 math.h 所对应的库文件并不在标准库中,而是在 /usr/lib/libm.so,所以需要显式指定。
所以应该使用这个命令:gcc -o test test.c /usr/lib/libm.so 。这样就可以编译通过
或者使用 gcc -o test test.c -lm。 这里面-lm 选项就是表示指定 math库
5.其他选项
类型 | 说明 |
-x language | 指定输入文件的编程语言(默认gcc 是根据源文件的后缀识别源文件的,但是也可以通过 -x强制显式指定) |
-v | 显示编译器的版本号 |
-g | 获得有关调试程序的详细信息,需要结合gdb 一起使用,参见下一篇博客 |
-ansi | 支持符合ANSI标准的C程序 |
Linux C编程学习之开发工具1---GCC编译器的更多相关文章
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- Linux C编程学习之开发工具2---GDB调试器
简介 GDB是一个功能强大的交互式程序调试工具,主要工作在字符界面下. GDB不仅可以用来调试C/C++ 语言编写的程序,还可以用来调试 Pascal.Objective-C,以及Fortran等语言 ...
- 【视频】Linux高级程序设计01.1开发工具及gcc gdb
[课程笔记] Linux 下编辑调试工具,gcc,gdb. 把高级语言编译成二进制可执行代码的工具. 需要经历四个步骤: (1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#incl ...
- Linux 系统编程 学习:00-有关概念
Linux 系统编程 学习:00-有关概念 背景 系统编程其实就是利用系统中被支持的调度API进行开发的一个过程. 从这一讲开始,我们来介绍有关Linux 系统编程的学习. 知识 在进行Linux系统 ...
- Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号
Linux 系统编程 学习:03-进程间通信1:Unix IPC(2)信号 背景 上一讲我们介绍了Unix IPC中的2种管道. 回顾一下上一讲的介绍,IPC的方式通常有: Unix IPC包括:管道 ...
- Linux 系统编程 学习:04-进程间通信2:System V IPC(1)
Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...
- Linux 系统编程 学习:06-基于socket的网络编程1:有关概念
Linux 系统编程 学习:006-基于socket的网络编程1:有关概念 背景 上一讲 进程间通信:System V IPC(2)中,我们介绍了System IPC中关于信号量的概念,以及如何使用. ...
- Linux 系统编程 学习:09-线程:线程的创建、回收与取消
Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...
- 编程入门-Java开发工具介绍及Eclipse安装
编程入门-Java开发工具介绍及Eclipse安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Java开发工具介绍 "源代码"一般是文字,所以可以使用记 ...
随机推荐
- [React] 多组件生命周期转换关系
前段时间一直在基于React做开发,最近得空做一些总结,防止以后踩坑. 言归正传,React生命周期是React组件运行的基础,本文主要是归纳多组件平行.嵌套时,生命周期转换关系. 生命周期 Reac ...
- 文件操作之FileOpenPicker、FileSavePicker和FolderPicker
Win10的开发经常需要进行文件的操作,因此文件的选择对话框FileOpenPicker.文件保存对话框FileSavePicker以及文件夹选择对话框FolderPicker十分重要.这三者的操作也 ...
- 什么是js面向对象??
简单的来说就是键值对,写一个函数,然后传值进去, function Person(name,age){ this.name = name; this.age ...
- BZOJ4520 [Cqoi2016]K远点对
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- Alpha阶段第九次Scrum Meeting
情况简述 Alpha阶段第九次Scrum Meeting 敏捷开发起始时间 2016/11/2 00:00 敏捷开发终止时间 2016/11/3 00:00 会议基本内容摘要 汇报进度,安排工作 参与 ...
- thinkphp 模型、控制器、视图
控制器里面调用模型 echo D('Goods')->index(); 调用GoodsModel下index 控制器里面调用其他控制器 echo A('Goods')->index(); ...
- 改进你的WordPress导航菜单 —— 输出标题描述
在WordPress 3.0中增加了自定义菜单功能,如果你在WordPress后台(外观>菜单)创建一个菜单,你可以在主题中使用wp_nav_menu()函数来显示这些菜单.但是像图中这种带描述 ...
- 直接拿来用,最火的.NET开源项目
综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面临的一系列共性的问题, 如安全(Security).日志(Logging).数据访问(Data Access).配置管理( ...
- coredump简介与coredump原因总结
from:http://www.cnblogs.com/doctorqbw/archive/2011/12/21/2295962.html 千兵卫博士 coredump简介与coredump原 ...
- C和指针 第三章 链接属性 extern、internal、none
三种链接属性 组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符. 链接属性有三种: external:外部 多个源文件中的相同标识 ...