zoukankan      html  css  js  c++  java
  • GCC入门

    目标文件的链接次序
      规范的连接次序为调用者在前,定义者在后。

      GNU make基于时间戳编译源文件。
      是否考虑次序取决于文件类型。

    链接外部库
      静态库。扩展名为“.a”,是通过GNU ar工具利用目标文件创建出来的。连接器会解析函数等的引用。
      标准系统库通常存放路径为/usr/lib或/lib

      gcc -v可以查看编译链接的详细信息

      gcc -Wall main.c -lm -o calc
      “-lNAME”相当于“libNAME.a”

      外部库的链接顺序,规则同目标文件的链接次序。

      对于引用,不显式声明(如,不不包含头文件),仍可能生成可执行程序。但运行时可能产生未知的错误。

    搜索路径
      “-I”指定头文件路径,“-L”指定库文件路径,此方式优先级最高(相比较设置环境变量的方式而言)
    在源代码中,不要使用绝对路径包含头文件,会影响程序的可移植性。

    搜索路径的环境变量
      通过文件“.bash_profile”设置编译时头文件和库文件的搜索路径
      通过设置编译环境变量C_INLCUDE_PATH或CPLUS_INLCUDE_PATH
      通过设置链接环境变量LIBRARY_PATH

    用ar生成库
      生成库文件 ar cr libxxx.a xxx.o yyy.o
      查看库文件中有多少个目标文件 ar -t libNAME.a

    动态库和静态库
      静态库文件后缀为“.a”,动态库文件后缀为“.so”
      动态库搜索路径的环境变量为:LD_LIBRARY_PATH

    预处理
      选项“-D”定义宏,使用方法为 “-DNAME=VALUE”,不指定值,默认为1
      cpp预定义的宏,查看方法为 cpp -DM /dev/null
      选项“-E”,仅预处理,不编译

    调试
      选项“-g”,用于生成调试信息
      查看core dump文件允许的大小,ulimit -c
      core dump大小不受限制,执行ulimit -c unlimited

    优化选项
      “-Olevel”,level取值为0-3
      “-funroll-loops”,将函数中的循环展开
      优化选项和“-g”可同时使用

    编译器工作步骤
      预处理(宏展开,头文件展开)
        示例:cpp hello.c > hello.i
      编译(将源代码转换为汇编代码)
        示例:gcc -Wall -S hello.i (生成hello.s)
      汇编(汇编代码转换为机器码)
        示例:as hello.s -o hello.o
      链接(创建最终的可执行程序)
        示例:gcc hello.o

    识别文件
      file命令
        各种属性:
          ELF--可执行文件
          LSB--least significant byte
          not stripped--(符号表)未剥离
      nm命令:查看符号表
        T -- 表明函数在目标文件中定义
        U -- 表示函数未被定义,需要链接外部的目标文件

      ldd命令:查看可执行程序依赖的动态库
        示例:ldd a.out

  • 相关阅读:
    1.解决有冲突的分支,切换分支时,文件不在了 2.冲突解决到底???
    Github到了一个工作区里面。嵌套了
    【计蒜课】【数据结构】【栈的复习】
    【计蒜课】【数据结构】【队列的复习】
    【计蒜课】【数据结构】【邻接矩阵使用的复习】
    【计蒜课】【数据结构】【链表的创建、插入、遍历操作的复习】
    【计蒜课】【数据结构】【顺序表查找、删除、遍历操作的复习答案】
    【计蒜课】【数据结构】【顺序表的构造、插入、扩容操作习题】
    实验六
    6.6实验五
  • 原文地址:https://www.cnblogs.com/collapsar/p/9196101.html
Copyright © 2011-2022 走看看