zoukankan      html  css  js  c++  java
  • gcc使用读书笔记

    声明:以下内容为阅读《linux C 编程-从初学到精通》时做的笔记。

    使用gcc编译程序时,编译过程细分为4个阶段:

    • 预处理(Pre-Processing)
    • 编译(Compiling)
    • 汇编(Assembling)
    • 链接(Linking)

    编译初步

    假如有文件hello.c,直接使用gcc hello.c ,则gcc编译默认产生a.out,运行该文件输入./a.out

    可以使用-o选项改变编译后的文件名,如 gcc -o hello hello.c,编译后产生hello,执行./hello即可运行。


    gcc 的警告提示功能

    一般使用gcc编译时,加上-Wall 会产生尽可能多的有用警告信息。

    如 gcc -Wall hello.c -o hello,编译时有警告会输出,无则不输出警告信息。

    对Linux程序员来讲,gcc给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用gcc编译源代码时,始终带上-Wall选项,并把它逐渐培养成一种习惯,这对找出常见的隐式编程错误是很有帮助的。


    优化gcc

    编译时使用-O可以告诉gcc同时减少代码的长度和执行时间。

    -O2告诉gcc除了完成-O的优化外,同时还进行一些额外的调整工作,如处理器指令调度。

    -O3告诉gcc除了完成-O2的优化外,还包括循环展开和其他一些与处理器特性相关的优化工作。

    一般都喜欢使用-O2选项,因为它在优化长度,编译时间和代码大小之间取得了理想的平衡点。

    试验时,可以使用time统计该程序运行时需要的时间。


    链接库

    linux下头文件(.h)默认路径为/usr/include/,而库文件(.so或.a)的默认路径是/usr/lib/。在linux下写程序时,有时候需要用第三方的函数库(如自己写的),这种情况编译时,需要指定所需要的头文件和库文件的路径。

    gcc采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径添加新的目录。如已写有foo.c文件,而在/home/linux/include/目录下有编译该程序需要的头文件,为了让gcc顺利找到它们,使用-I选项

    gcc foo.c -I /home/linux/include -o foo

    同样,如果使用了不在标准位置的库文件,那么可以通过-L选项向gcc的库文件搜索路径添加新的目录。如在/home/linux/lib/目录下有程序foo.c程序链接时所需要的库文件libfoo.so,为了让gcc顺利找到它,并成功编译成可执行文件foo,可以使用下面命令:

    gcc foo.c -L /home/linux/lib -lfoo -o foo

    在上面的编译命令中,它指示gcc去链接库文件libfoo.so。linux下的库文件在命名时有一个约定,那就是应该以“lib”三个字母开头,由于所有库文件都遵循了同样的规范,因此在使用-L选项指定链接的库文件名时可以省去“lib”三个字母,也就是gcc在对“-lfoo”字串进行处理时,会自动去链接名为“libfoo.so”的文件。

     另外,linux下的库文件分为两大类,分别是动态链接库(.so)和静态链接库(.a),两者的区别在于程序执行时所需的代码是在运行时动态加载的还是编译时静态加载的。默认情况下,gcc在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。如

    gcc foo.c -L /home/linux/lib -static -lfoo -o foo


    同时编译多个源程序

    假如有一个有foo1.c,foo2.c,foo3.c三个源文件组成的程序,为了对它们进行编译,并生成可执行程序foo,可以使用下面命令:

    gcc foo1.c foo2.c foo3.c -o foo

     这条命令相当于依次执行下面四条命令:

    gcc -c foo1.c -o foo1.o

    gcc -c foo2.c -o foo2.o

    gcc -c foo3.c -o foo3.o

    gcc foo1.o foo2.o foo3.o -o foo

     如果有更多的文件需要编译的话,就需要借助make工具。

  • 相关阅读:
    推荐一款功能强大的js 在线编辑器
    盒子游戏(湖南省第七届大学生计算机程序设计竞赛)
    面试中常问到的称小球问题
    移动开发中的Scheme跳转说明——Allowing OtherApps to Start Your Activity
    uva 10069 Distinct Subsequences(高精度 + DP求解子串个数)
    自适应滤波器(Adaptive Filter)
    软件设计中的同步异步单线程多线程优缺点分析
    iphone关于单倍图和二倍图(导航 背景 变高)
    注解
    Qt Creator项目中使用qss
  • 原文地址:https://www.cnblogs.com/ivorfeng/p/3058959.html
Copyright © 2011-2022 走看看