zoukankan      html  css  js  c++  java
  • Linux下如何编译并运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、 Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编 写并经gcc编译而成的.
    1 . 编译单个源文件
        [例如]在屏幕上打印"Hello,Linux."

    1. #include<stdio.h>  
    2. #include<stdlib.h>  
    3. int main(int argc,char **argv)  
    4. {  
    5.     printf("Hello,Linux. ");  
    6.     exit(0);  
    7. }  

    1)将源文件保存为hello.c,
    2)开始进行编译: $gcc -o hello hello.c
          编译成功完成后,在当前路径下,生成一个名为hello的文件
    3)执行:  $./hello
        在屏幕上,你将会看到打印结果:Hello,Linux.
        说明:在默认情况下,编译成功完成后,会在当前路径下,生成一个名为a.out的文件,然后执行$./a.out便可打印结果,但通常可以通过选项-o来指定自己的可执行程序名称;
    2.编译多个源文件
    3.使用外部函数库
    4.使用共享函数库和静态函数库
    5.gcc选项详细描述
     GCC最基本的用法是∶gcc [options] [filenames]

      其中options就是编译器所需要的参数,filenames给出相关的文件名称。
      -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
      -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
      -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
      -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
      -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
      -Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
      A)#include <myinc.h>
      B)#include “myinc.h”

      其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。

    6 执行过程
         Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编 译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

    1)代码 a.c:

    1. #include <stdio.h>  
    2. int main()  
    3. {  
    4. printf("hello ");  
    5. }  

    2)预编译过程:
      这个过程处理宏定义和include,并做语法检查。
      可以看到预编译后,代码从5行扩展到了854行。
      gcc -E a.c -o a.i
      cat a.c | wc -l
      5
      cat a.i | wc -l
      854
    3)编译过程:
      这个阶段,生成汇编代码。
      gcc -S a.i -o a.s
      cat a.s | wc -l
      59
    4)汇编过程:
      这个阶段,生成目标代码。
      此过程生成ELF格式的目标代码。
      gcc -c a.s -o a.o
      file a.o
      a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
    5)链接过程:
      链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
      gcc a.o -o a
    6)程序运行:
      ./a
      hello

  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/dreamans/p/3198470.html
Copyright © 2011-2022 走看看