码迷,mamicode.com
首页 > 其他好文 > 详细

GCC入门

时间:2018-06-18 21:42:51      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:文件类型   core   解析   调试   编译   nbsp   out   错误   连接   

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

  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

 

GCC入门

标签:文件类型   core   解析   调试   编译   nbsp   out   错误   连接   

原文地址:https://www.cnblogs.com/collapsar/p/9196101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!