标签:文件类型 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
标签:文件类型 core 解析 调试 编译 nbsp out 错误 连接
原文地址:https://www.cnblogs.com/collapsar/p/9196101.html