Linux系统编程-gcc(黑马笔记)
1 gcc的编译流程
gcc编译的整个过程并且整个过程下来的每个过程。并且给出了每个阶段产物和gcc命令。
1.1 数据段合并
其实就是因为“块” 一次是读多个字节而不是一个字节,所以会将一些地址段合并从而提升效率
1.2 地址回填
这张图也有些问题,正确的结论是:
地址回填发生在编译器后端生成汇编/机器码时,属于 .c → .o
过程中的代码生成步骤
地址回填:其实就是在最后的链接过程中将main函数的真实地址更改掉
以下为一个示例,其他过程同理。
gcc -c test.c -o test.0
链接命令 -o可以指定输出的文件名
gcc [目标文件列表] [库选项] -o 输出可执行文件名
gcc main.o utils.o -o app
2 gcc的常用命令
2.1linux中c++函数常用的一种写法,可以用来给main函数传递参数
int main(int argc, char *argv[])
{printf("argc = %d\n", argc);return 0;
}
argc 是 参数的个数(argument count),包括程序名本身。
argv 不是“统计字符”,而是一个 字符串指针数组(argument vector),每个元素是一个 C 字符串(
char *
),指向一个 以空字符\0
结尾的参数。argv[0]
→ 程序名或启动路径argv[1]
→ 第一个用户参数argv[argc]
→ 固定为NULL
,作为哨兵。
分隔规则
默认由shell按**空白字符(空格、Tab、换行)**切分。
如果参数本身含空格,用引号(单或双)或反斜杠
\
转义即可保持为一个整体。
./hello one "two words" three
argc = 4
argv 内容为
argv[0] = "./hello" argv[1] = "one" argv[2] = "two words" argv[3] = "three" argv[4] = NULL
2.2 gcc指定头文件目录
当头文件和源文件不在同一个目录时候可以用以下命令
其中头文件在./inc 文件夹下
gcc -I./inc hello.c -o hello