GCC功能及使用

功能:

预处理、编译、连接、汇编

编译过程(从源代码到可执行文件)

预处理:gcc -Ehello.c -o hello.i
 //生成预处理后的源文件
汇编:gcc -S hello.i //生成hello.s
目标代码生成:gcc -c hello.s //生成hello.o
连接:gcc hello.o -o hello
//生成可以行文件hello

静态库、动态库:

方法一:将hello1.c和hello2.c编译成静态链接库.a

[root@localhost main5]#gcc -c hello1.c hello2.c   

  //将hello1.c和hello2.c分别编译为hello1.o和hello2.o,其中-c选项意为只编译不链接。

[root@localhost main5]#ar -r libhello.a hello1.o hello2.o   

//将hello1.o和hello2.o组合为libhello.a这个静态链接库

[root@localhost main5]#cp libhello.a /usr/lib     

//将libhello.a拷贝到/usr/lib目录下,作为一个系统共享的静态链接库

[root@localhost main5]#gcc -o hello hello.c -lhello  

//将hello.c编译为可执行程序hello,这个过程用到了-lhello选项,这个选项告诉gcc编译器到/usr/lib目录下去找libhello.a的静态链接库

以上的过程类似于windows下的lib静态链接库的编译及调用过程。
方法二:将hello1.o和hello2.o组合成动态链接库.so

[root@localhost main5]#gcc -c -fpic hello1.c hello2.c   

 //将hello1.c和hello2.c编译成hello1.o和hello2.o,-c意为只编译不链接,-fpic意为位置独立代码,指示编译程序生成的代码要适合共享库的内容这样的代码能够根据载入内存的位置计算内部地址。

[root@localhost main5]#gcc -shared hello1.o hello2.o -o hello.so 

  //将hello1.o和hello2.o组合为shared object,即动态链接库

[root@localhost main5]#cp hello.so /usr/lib  

  //将hello.so拷贝到/usr/lib目录下

[root@localhost main5]#gcc -o hello hello.c hello.so  

//将hello.c编译链接为hello的可执行程序,这个过程用到了动态链接库hello.so

时间: 2024-08-11 20:15:17

GCC功能及使用的相关文章

GCC编译器优化选项分析及具体优化了什么

问题 在使用gcc作为编译器.在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下往往会出现很多种预料之外的结果,尤其在嵌入式环境中,程序在板子上运行的时候,问题就愈发明显. 为了了解具体为什么造成该问题,对两种模式下的配置做了对比 debug模式编译器参数为-O0 -g –Wall release模式编译器参数为-O2 -g –Wall 通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?现在我们来看看gcc编译器的优化

GCC性能优越的多平台编译器详解

不经意间,GCC已发展到了4.3的版本,尽管在软件http://www.aliyun.com/zixun/aggregation/36661.html">开发社区之外乏人闻问,但因为GCC在几乎所有开源软件和自由软件中都会用到,因此它的编译性能的涨落会直接影响到Linux .Firefox 乃至于OpenOffice.org和Apache等几千个项目的开发.因此,把GCC摆在开源软件的核心地位是一点也不为过.另一方面,GCC4.3的出现,正在牵引着广大程序员们的心.如果我们非要用一个词来说

gcc/g++编译器和gdb调试器

gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp]2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]4.连接目标代码,生成可执行程序[链接器ld] [参数详解]-x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C

使用Visual C++防御功能保护您的代码

目录 基于堆栈的缓冲区溢出检测 (/GS) 安全异常处理 (/SafeSEH) DEP 兼容性 (/NXCompat) 映像随机化 (/DynamicBase) 更安全的函数调用 C++ Operator::new 如果失败会怎样? 许 多代码都是使用 C 和 C++ 编写的,但遗憾的是,其中很多此类代码都有一些甚至连开发人员都不知道的安全漏洞.以任何语言编写的程序都存在可能会使其用户受到攻击的漏洞,但 C 和 C++ 语言在 Internet 历史上占有特殊的地位,原因是它们的许多安全漏洞都源

Linux上安装GCC编译器过程

2004年4月20日最新版本的GCC编译器3.4.0发布了.目前,GCC可以用来编译C/C++.FORTRAN.JAVA.OBJC.ADA等语言的程序,可根据需要选择安装支持的语言.GCC 3.4.0比以前版本更好地支持了C++标准.本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程. 安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器.如果系统上没有编译器,不能安装源代码形式的GCC 3.4.0.如果是这种情况,可

The path "/usr/bin/gcc" is not valid path to the gcc binary

安装 VMWare tools 时出现"The path "/usr/bin/gcc" is not valid path to the gcc binary" 环境:Vmware 8.0+RedHat 9.0 问题:安装 VMWare tools 时询问GCC安装位置,出现"The path "/usr/bin/gcc" is not valid path to the gcc binary".查询是否安装了GCC,显示确实

CentOS如何查看当前系统下的gcc版本命令?

  CentOS如何查看当前系统下的gcc版本命令?          1. gcc -v(Display the programs invoked by the compiler) [root@localhost /]# gcc -v Reading specs from /usr/i386-glibc-2.1-linux/lib/gcc-lib/i386-glibc21-linux/egcs-2.91.66/specs gcc version egcs-2.91.66 19990314/Li

nodejs中实现sleep功能实例

 这篇文章主要介绍了nodejs中实现sleep功能实例,本文讲解了sleep功能的开发过程和使用效果及性能测试,需要的朋友可以参考下     nodejs最让人不爽的就是其单线程特性,很多事情没法做,对CPU密集型的场景,性能也不够强劲.很长一段时间,我想在javascript语言框架下寻求一些解决方案,解决无法操作线程.性能差的问题.曾经最让我印象深刻的方案是fibers,不过fibers也好,其他方案也好,在线程操作上还是很别扭,太过依赖辅助线程,本末倒置:就fiber而言,javascr

[gcc核心扩展]关于gcc中的typeof以及其他东东

(使用以下扩展可能需要使用-gnu99)   GNC CC是一个功能非常强大的跨平台C编译器,它对C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.本文把支持GNU 扩展的C 语言称为GNU C. Linux 内核代码使用了大量的 GNU C 扩展,以至于能够编译 Linux 内核的唯一编译器是 GNU CC,以前甚至出现过编译 Linux 内核要使用特殊的 GNU CC 版本的情况.本文是对 Linux 内核使用的 GNU C 扩展的一个汇总,希望当你读