GCC入门

Posted collapsar

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 









































以上是关于GCC入门的主要内容,如果未能解决你的问题,请参考以下文章

GCC快速入门

GCC内联汇编入门

GCC内联汇编入门

GCC内联汇编入门

GCC入门

gcc编译c入门