GCC编译文件步骤

利用ultraEdit的编译环境:

比如:建立hello.c文件,

#include <stdio.h>

int main(void)
{
 printf("hello, world!/r/n");
 return 0;
}

 第一步,在shell环境下,touch命令建立一个文件,

         如:touch  hello.c

 第二步:确定一下linux系统的FTP服务是否开启,必须在Root环境下

         命令:su  - root:用来切换的根目录环境下,键入密码

        打开配置文件 cd  etc/init.d

               键入命令 ls:查看当前目录,看到vsftpd,

              vsftpd中可以查询ftp :如,status:查询ftp服务的状态;stop:停止ftp服务;start:开启ftp服务;restart:重启服务

        查询命令:为 ./vsftpd status ;

       开启命令:为 ./vsftpd start;

      第三步:切换用户环境  su - user(用户名);

键入命令  : gcc  -o hello hello.c  或         gcc hello.c -o hello                                                         

                   ./hello

    输入:hello,world

说明:

    列子:

                 将hello.i编译为目标代码,这可以通过使用-c参数来完成:   
                                                                               
                                                                               
                                #  gcc -c hello.i -o hello.o        

       GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开
   始执行编译过程,也可以   

使用-x参数让GCC从指定的步骤开始编译(如上列子所述).最后一步是将生成的目标文件链接成可执行文件  :                                                                              
                                                                               
            #  gcc hello.o -o hello                               

     用GCC能够很好地管理这些编译单元.假设有一个由foo1.c和foo2.c两个源文件组成的程序 
,为了对它们进行编译, 并最终生成可执行程序foo,可以使用下面这条命令:                                    
                                                                               
                #  gcc foo1.c foo2.c -o foo    

如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行.如果深
究起来,上面这条命令大 致相当于依次执行如下 三条命令:                                                  
# gcc -c foo1.c -o foo1.o                                                      
# gcc -c foo2.c -o foo2.o                                                      
# gcc foo1.o foo2.o -o foo                                                     
                                                                               
在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的.假
设项目中有100个源文件需要编译,并且每 个源文件中都包含10000行代码,如果像上面那样仅用一条GCC命令来完成编译工作,那么GCC需要将每个源文件都重新编译一遍,然后再全部连接起来. 很显然,这样浪费的时间相当多,尤其是 当用户只是修改了其中某 一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文 件 是不会改变的.要解决这个问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具.

### GCC编译过程详解 GCC(GNU Compiler Collection)是一种广泛使用的开源编译工具链,支持多种编程语言,包括C、C++、Fortran等。在Linux系统中,GCC是开发C/C++应用程序的主要工具之一。整个编译流程可以分为四个主要阶段:**预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)**。下面将对每个步骤进行详细说明。 #### 1. 预处理(Preprocessing) 预处理阶段主要处理源代码中的预处理指令,如宏定义(`#define`)、条件编译(`#ifdef`、`#ifndef`)、头文件包含(`#include`)等。预处理器会根据这些指令生成一个没有宏和条件判断的纯C/C++代码文件。 - **输入文件**:`.c` 或 `.cpp` - **输出文件**:`.i`(预处理后的C代码) - **命令示例**: ```bash gcc -E source.c -o source.i ``` 该阶段不会进行语法检查或翻译,仅负责文本替换和文件合并。 #### 2. 编译(Compilation) 编译阶段将预处理后的代码转换为目标平台的汇编语言代码。这个过程包括词法分析、语法分析、语义分析以及中间代码生成等多个子阶段。最终生成的文件是人类可读的汇编代码。 - **输入文件**:`.i` - **输出文件**:`.s`(汇编代码) - **命令示例**: ```bash gcc -S source.i -o source.s ``` 此阶段会对代码进行语法和语义检查,若发现错误将终止编译流程并提示错误信息。 #### 3. 汇编(Assembly) 汇编阶段将上一阶段生成的汇编代码转换为机器码(目标代码),即二进制形式的指令集,但此时还不是完整的可执行程序。生成的文件通常是目标文件(Object File),其格式为ELF(Executable and Linkable Format)或其他平台相关格式。 - **输入文件**:`.s` - **输出文件**:`.o`(目标文件) - **命令示例**: ```bash gcc -c source.s -o source.o ``` 此阶段不涉及函数之间的调用解析,因此无法直接运行。 #### 4. 链接(Linking) 链接阶段是将多个目标文件(`.o`)和库文件(静态库`.a`或动态库`.so`)合并成一个完整的可执行文件。链接器会解析各个模块之间的符号引用,确保所有外部函数和变量都能正确找到对应的定义。 - **输入文件**:多个`.o`文件和库文件 - **输出文件**:可执行文件(无扩展名,或`.exe`在Windows下) - **命令示例**: ```bash gcc source1.o source2.o -o program ``` 链接过程可以是静态链接(将库代码复制到可执行文件中)或动态链接(运行时加载共享库)。 --- ### 总结与流程图 GCC的完整编译流程如下: ```text source.c ↓ 预处理 (-E) source.i ↓ 编译 (-S) source.s ↓ 汇编 (-c) source.o ↓ 链接 (默认) program ``` 开发者可以通过指定不同的选项来控制GCC只执行其中某一步骤,从而更清晰地观察每一步的变化[^1]。 --- ### 示例代码 以下是一个简单的C程序及其编译过程示例: ```c // hello.c #include <stdio.h> int main() { printf("Hello, GCC!\n"); return 0; } ``` 逐步编译命令如下: ```bash gcc -E hello.c -o hello.i # 预处理 gcc -S hello.i -o hello.s # 编译 gcc -c hello.s -o hello.o # 汇编 gcc hello.o -o hello # 链接 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值