一.gcc入门(上)
  1.gcc相关概念
  gcc(GNU C Compiler)编译器,最初支持C语言,现已支持C、C++、Java、Pascal、Ada、COBOL语言等;支持多种硬件平台;
  gcc不仅仅是本地编辑器,他还能跨平台交叉编译;
  gcc有多重语言前端,用于解析不同的语言;
  gcc是模块化设计的,可以加入新语言和新CPU架构的支持;
  gcc是自由软件;
  2.gcc编译程序过程示意图
hello.c-->预处理(cpp)hello.i-->编译器(ccl)hello.s-->汇编器(as)hello.o,printf.o-->链接器(ld)hello
源程序(文本)->被修改的源程序(文本)->汇编程序(文本)->可重定位目标程序(二进制)->可执行目标程序(二进制)
#gcc -E(预处理宏定义的展开) hello.c -o hello.i(目标文件)
#gcc -s(编译) hello.i -o hello.s
#gcc -c(汇编) hello.s -o hello.o(通知gcc取消链接步骤,即编译源码并在最后生成目标文件)
#gcc hello.o -o hello
#./hello
hello
一次完成
#gcc hello.c -o hello
#gcc -c hello.c(只到第三步,不参加链接)
3.-Wall的使用,防止产生预期的错误,出错提醒
#gcc -Wall hello.c -o hello
正确的情况下不提示,错误提醒
4.模块化编译:
#include<stdio.h>
void hellofn();
void main();
两个函数文件的编译链接
#gcc -Wall hellofn.c main.c -o man
#ls
main
#./main
hello
同样也可以,将两个文件都生成链接文件,链接生成目标文件
#gcc -Wall -c hellofn.c -o hellofn.o
#gcc -Wall -c main.c -o main.o
#gcc -Wall hellofn.o main.o -o main
#ls
main
#./main
hello
如果其中一个文件发生改变,只需要编译一部分即可;
如果工程中有许多,独立编译的文件,则需要建立makfile的脚本进行大规模的编译;
小结:
gcc的概念
gcc的特点
gcc编译过程
gcc常用选项
gcc编译多文件
二、gcc入门(下)
01.头文件与库文件
  在使用c语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统函数库调用的声明。
  库文件是一些预编译好的函数集合,哪些函数都是按照可重用原则编写。它们通常由一组相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等。
02.使用外部库(-l选项)
//calc.c
#include<math.h>
#include<stdio.h>
int main(void)
{
double x = pow(2.0,3.0);
printf("The cubed is %f\n",x);
return 0;
}
#gcc -Wall calc.c -o calc -lm
#ls /usr/lib/libm.a
#ls  /usr/lib/libm.so
03.静态库与共享库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序在运行的时候将不再需要静态库。
动态库(.so或.sa):程序在运行的时候才去链接共享的代码,多个程序共享使用库的代码。
 一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
  在可执行文件开始运行以前,外部函数的机器码有操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking)
  共享库可以在多个程序间共享,所有动态链接使用得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一根共享库被要用到该库的所有进程公用,节省了内存和磁盘空间。
04.生成静态库
ar(gnu归档工具) rcs(replace and create)
例如:#ar rcs libhello.a hello_fn.o
#gcc -Wall main.c libhello.a -o main
#./main
hello world!!!
#gcc -Wall main.o -o main -lhello(libhello可简写为lhello)
/usr/bin/ld:cannot find -lhello
#gcc -Wall -L.(在当前路径下查找lhello这个库)
在链接生成main可执行文件后,lhello.a静态库文件可以删除
#rm lhello.a
#./main
hello world!!!
#vi ~/.bash_profile
export LIBRARY PATH = /(指定环境变量,到该目录下搜索库)
05.生成共享库
shared:表示生成共享库格式
fPIC:产生位置无关码(position independent)
#gcc -shared -fPIC hello_fn.o -o libhello.so
#ls
libhello.so
#gcc -Wall -L. main.o -o main -lhello
(静态库与共享库同时存在时,优先调用共享库)
#cp main /tmp
#./main
./main error:……
第一种方法:
#cp libhello.so /usr/lib
#./main
hello world!!!
第二种方法:更改LD_LIBRARY_PATH(当前用户)
#vi ~/.bash_profile
增加该文件路径
第三种方法:ldconfig,配置ld.so.conf,ldconfig更新ld.so.cache
#vi /etc/ld.so.conf
(修改路径)
#ldconfig(更新命令)
#ldd main
(main程序包含了哪些库)
#ldd hello
(hello包含了哪些库)
小结:
使用外部库:-lhello
静态库与共享库:三种方法
生成静态库
生成动态库

Linux开发工具之gcc的更多相关文章

  1. Linux开发工具的使用

    1.   Linux开发工具的使用 Vim编译的使用 Gdb调试工具的使用 Makefile的编写 linux跟踪调试 SSH的使用 subversion的使用 1.   Linux开发工具的使用 V ...

  2. Linux开发工具教程

    今天把上个星期写的Linux开发工具相关的教程整理一下,方便阅读: 1.第一课 GCC入门: 2.第二课 GCC入门之静态库以及共享库: 3.第三课 Makefile文件的制作(上) : 4.第四课 ...

  3. 【视频】Linux高级程序设计01.1开发工具及gcc gdb

    [课程笔记] Linux 下编辑调试工具,gcc,gdb. 把高级语言编译成二进制可执行代码的工具. 需要经历四个步骤: (1) 预处理:去掉注释,进行宏替换(#define相关),头文件(#incl ...

  4. Linux编译工具:gcc入门

    1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器.最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还 ...

  5. Linux开发工具之Makefile(上)

    二.makefile(上) 01.make工具   利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...

  6. 蜂鸟E203系列——Linux开发工具

    欲观原文,请君移步 Vivado安装 vivado是运行工程的工具,所以必须安装 后台回复[vivado2017]可获取vivado 2017.4 | 后台回复[vivado2020]可获取vitis ...

  7. Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成

    问:我在Linux中运行一个make文件去编译C语言代码,然后得到了如下的错误信息: gcc  -Wall  -fPIC  -DSOLARIS  -DXP_UNIX  -DMCC_HTTPD  -D_ ...

  8. Linux开发工具之gdb(上)

    三.gdb调试(上) 01.gdb:gdb是GNU debugger的缩写,是编程调试工作. 功能:   启动程序,可以按照用户自定义的要求随心所欲的运行程序:   可让被调试的程序在用户所指定的调试 ...

  9. Linux开发工具之Makefile(下)

    二.Makefile(下) 01.make常用内嵌函数 函数调用   $(function arguments) $(wildcard PATTERN)   当前目录下匹配模式的文件   例如:src ...

随机推荐

  1. delphi定义自己的消息

    定义一个消息需要两个步骤: 1.声明一个消息标识符 2.声明一个消息记录类型 一个消息标识符是一个整数大小的常数.Windows自用低于1024的消息,所以当你声明你自己的消息,你应该开始高于这一数字 ...

  2. 使用Echarts的五个步骤

     _liuz 2015-07-22 09:35:53 参考网址:http://echarts.baidu.com/doc/start.html 一.制作一个图表容器<div id="m ...

  3. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  4. RHEL/CentOS 6.x 系统服务详解

    PS:RHEL/CentOS 6.x的系统服务比5.x系列的要多了很多新面孔,估计很多童鞋不甚理解,网上这方面资料也很少.理解这个对运维人员是必要的,因为开启不必要的服务越 多,系统就相对越不安全.不 ...

  5. 转: 静态模式makefile中$(cobjs): $(obj)/%.o: $(src)/%.c

    4.12 静态模式静态模式规则是这样一个规则:规则存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件.静态模式规则比多目标规则更通用,它不需要多个目标具有相同的依赖.但是静态模式规 ...

  6. 我的VSTO之路(二):VSTO程序基本知识

    原文:我的VSTO之路(二):VSTO程序基本知识 开始之前,首先我介绍一下我的开发环境:VS2010 + Office 2010,是基于.Net framework 4.0和VSTO 4.0.以下的 ...

  7. CH Round #51 - Shinrein祭 #1

    A.Phorni 题目:http://www.contesthunter.org/contest/CH%20Round%20%2351%20-%20Shinrein祭%20%231/Phorni 没做 ...

  8. POJ-3261-Milk Patterns(后缀数组)

    题意: 给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠. 分析: 先二分答案,然后将后缀分成若干组. 不同的是,这里要判断的是有没有一个组的后缀个数不小于k. 如果有,那么存在k ...

  9. 快速傅里叶变换(FFT):COGS 2216. 你猜是不是KMP

    2216. 你猜是不是KMP ★★★☆   输入文件:guess.in   输出文件:guess.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] XX在玩两个串的游戏. ...

  10. QTP关于AOM的Javascript启动方式

    序 QTP的AOM模型想必大家都很熟悉了,平时常用的就是通过VBS脚本的方式编写启动程序(也是我现在用的方法).其实,还有很多其他的方式,如Java,C#,JS,这些语言都是通过调用QTObjectM ...