linux中gcc编程

GUN c compiler / gun compiler collection 的缩写

gcc 是编译c代码
g++ 是编译c++代码

预处理 pre-processing -cpp

语法分析 -》 rtl —》 代码优化 —》汇编代码

.c 是c源程序 .i 是经过与处理的

.C;.cc;.cxx 是c++原始程序
.ii是c++经过预处理的程序
编译 compiling -ccl

汇编 assembing  -as
//
静态库 lib.a 共享库 lib.so
实践:写两个简单的源文件编译为一个共享库,然后再写一个程序调用这个共享库

c语法错误
头文件错误
连接库错误
未定义符号
//
程序的编译过程

对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:

预处理 —》 编译——》汇编——》连接

功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。

在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:

                                                   gcc -E  test.c  -o  test.i


在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:

                                                  gcc   -S  test.i   -o  test.s


在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:

                                                   gcc   -c  test  -o  test.o


最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:

                                                 gcc       test.o   -o   test


上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。


GCC常用模式

这里介绍GCC追常用的两种模式:编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见,假设我们全部的源代码都在一个文件test.c中,要想把这个源文件直接编译成可执行程序,可以使用以下命令:

                                $  gcc   test.c  -o  test

这里test.c是源文件,生成的可执行代码存放在一个名为test 的文件中(该文件是机器代码并且可执行)。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件(此文件虽然也是机器代码但不可执行),可以使用标记-c ,详细命令如下所示:

                               $   gcc   -c    test.c

默认情况下,生成的目标文件被命名为test.o,但我们也可以为输出文件指定名称,如下所示:

                               $ gcc  -c   test.c  -o  mytes.o

上面这条命令将编译后的目标文件命名为mytest.o,而不是默认的test.o。

迄今为止,我们谈论的程序仅涉及到一个源文件;现实中,一个程序的源代码通常包含在多个源文件之中,这该怎么办?没关系,即使这样,用GCC处理起来也并不复杂,见下例:

                               $ gcc   -o  test   first.c  second.c    third.c


该命令将同时编译三个源文件,即first.c、second.c和 third.c,然后将它们连接成一个可执行程序,名为test。



/
-I 指定目录(找自己写的头文件,现在当前目录,再在指定的目录下搜索)
-L 指定目录(找库文件)
-l 在连接过正中加载指定库文件  -l abc 连接时加载abc库文件
//
-c  只编译 生成 .o文件
-s  输出汇编语言
-o  连接生成可执行文件(或动态链接库)
-O  编译时进行优化

/ gcc编程的基本步骤

示例:

//先建三个目录 inc盛头文件  lib盛库文件 src盛源文件

 > mkdir inc
 > mkdir lib
 > mkdir src //源文件

建立一个静态链接库

cd src
vi tool.c
#include<stdio.h>

int add(int x,int y)
{
  return x+y;
}

gcc -c -o tool.c

ar 创建一个函数库

ar rv libtools.a tool.o(添加目标文件)

vi tool1.c
#include<stdio.h>

int add(int x,int y)
{
  return x-y;
}
ar rv libtools.a tool1.o(添加目标文件)

ar tv libtools.a// 查看库信息



建立头文件

cd inc

vi my.h

#define VALUE 100

cd src
vi main

#include"my.h"
#include<stdio.h>
main()
{
 
  fprintf(stdarr."VALUE + 10 = %d" ,add(VALUE,10));
 
}

进行编译
gcc -c -I ../src main.c// -l ../src 是指定搜索main.c中“my.h"文件的路径

生成main.o

接着进行连接
gcc main.o  -L ../lib -ltools -o main//生成可执行文件 -L ../lib 指定库文件路径 -l 指定要连接的库文件

//

生成动态链接库

vi a.c
#include<stdio.h>
int add(int x,int y)
{
   return x+y;
}

gcc -fPIC -c a.c //将a.c文件编译成,-fPIC告诉编译器你要给我生成一个 可以重定位的目标文件
                 // 生成a.o目标文件

gcc -shared -o libabc.so a.o //将目标文件连接成 动态链接库
/
编写程序调用自己建立的动态链接库

vi b.c

#include<stdio.h>
main()
{
 
  printf(“1+2=%d“,add(1,2));
}

gcc -c -O b.c 编译生成目标文件b.o


export LD_LIBRARY_PATH = ./   //设置环境变量值为 ./
gcc b.o -L ./ -l abc -s -o b  // -s 搜索.so结尾的文件

本文为作者多方”剽窃“结合自己所学组合所得,如有错误请回复指点,希望能对同道中人有所帮助。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值