zoukankan      html  css  js  c++  java
  • GCC编译C程序源代码

    编译简单的 C 程序
    C 语言经典的入门例子是 Hello World,下面是一示例代码:
    #include <stdio.h> 

    int main(void) 

    {
        printf("Hello, world! ");     

    return 0; 

    }
    我们假定该代码存为文件‘hello.c’。要用 gcc 编译该文件,使用下面的命令:
    $ gcc -g -Wall hello.c -o hello
    该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。
    注意到如果当前目录中与可执行文件重名的文件已经存在,它将被覆盖。
    选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。 注意如果有用到math.h库等非gcc默认调用的标准库,请使用-lm参数
    本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。 选项 ""-g"" 表示在生成的目标文件中带调试信息,调试信息可以在程序异常中止产生core后,帮助分析错误产生的源头,包括产生错误的文件名和行号等非常多有用的信息。 要运行该程序,输入可执行文件的路径如下:
    $ ./hello
    Hello, world!
    这将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’。 点击此处下载本节的操作视频
    捕捉错误
    如上所述,当用 C 或 C++ 编程时,编译器警告是非常重要的助手。为了说明这一点,下面的例子包含一个微妙的错误:为一个整数值错误地指定了一浮点数控制符‘%f’。
    #include <stdio.h>  
    int main (void) 

    {
        printf ("Two plus two is %f ", 4);     

        return 0; 

    }
    一眼看去该错误并不明显,但是它可被编译器捕捉到,只要启用了警告选项 -Wall。 编译上面的程序‘bad.c’,将得到如下的消息:
    $ gcc -Wall -o bad bad.c 

    main.c: 在函数‘main’中:
    main.c:5: 警告: 格式‘%f’需要类型‘double’,但实参 2 的类型为‘int’
     
    这表明文件 ‘bad.c’第 6 行中的格式字符串用法不正确。GCC 的消息总是具有下面的格式 文件名:行号:消息。编译器对错误与警告区别对待,前者将阻止编译,后者表明可能存在的问题但并不阻止程序编译。
    本例中,对整数值来说,正确的格式控制符应该是 %d。
    如果不启用 -Wall,程序表面看起来编译正常,但是会产生不正确的结果:
    $ gcc bad.c -o bad 

    $ ./bad
    Two plus two is 0.000000
    显而易见,开发程序时不检查警告是非常危险的。如果有函数使用不当,将可能导致程序崩溃或产生错误的结果。开启编译器警告选项 -Wall 可捕捉 C 编程时的多数常见错误。

    编译多个源文件
    一个源程序可以分成几个文件。这样便于编辑与理解,尤其是程序非常大的时候。这也使各部分独立编译成为可能。
    下面的例子中我们将程序 Hello World 分割成 3 个文件:‘hello.c’,‘hello_fn.c’和头文件‘hello.h’。

    这是主程序‘hello.c’:
    #include "hello.h" 

    int main(void) 

    {
        hello ("world");     

        return 0; 

    }
    在先前例子的‘hello.c’中,我们调用的是库函数 printf,本例中我们用一个定义在文件‘hello_fn.c’中的函数 hello 取代它。
    主程序中包含有头文件‘hello.h’,该头文件包含函数 hello 的声明。我们不需要在‘hello.c’文件中包含系统头文件‘stdio.h’来声明函数 printf,因为‘hello.c’没有直接调用 printf。

    文件‘hello.h’中的声明只用了一行就指定了函数 hello 的原型。
    void hello (const char * name);


    函数 hello 的定义在文件‘hello_fn.c’中:
    #include <stdio.h> 

    #include "hello.h"  
    void hello (const char * name) 

    {
        printf ("Hello, %s! ", name); 

    }
    语句 #include "FILE.h" 与 #include <FILE.h> 有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,后者只搜索系统头文件而不查看当前目录。 要用gcc编译以上源文件,使用下面的命令:
    $ gcc -Wall hello.c hello_fn.c -o newhello
    本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newhello。注意到头文件‘hello.h’并未在命令行中指定。源文件中的的 #include "hello.h" 指示符使得编译器自动将其包含到合适的位置。
    要运行本程序,输入可执行文件的路径名:
    $ ./newhello 

    Hello, world!
    源程序各部分被编译为单一的可执行文件,它与我们先前的例子产生的结果相同。

    ---------------------------------------

    undefined reference to `sqrt' 问题

    在gcc下用到数学函数,如sqrt。在gcc时要加上 -lm 参数,这样告诉编译器我要用到数学函数了 。

    如:
    gcc a.c -o a -lm

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/emanlee/p/3188033.html
Copyright © 2011-2022 走看看