C的编译链接及Makefile学习

本文详细介绍了C程序从编译到执行的过程,重点解析了GCC编译器的选项,如-C,-o,-l,-L,-I等,并探讨了GDB调试器的使用。此外,深入讲解了Makefile的规则、选项如CFLAGS,LDFLAGS,LIBS,以及在内核模块开发中的应用,旨在帮助开发者理解和自动化构建C程序。
摘要由CSDN通过智能技术生成

参考博客

本文参考/copy了如下博客的内容,自己参考进行了些补充,支持原创:

  1. 陈皓,跟我一起写 Makefile

  2. GUYUEZHICHENG,Makefile教程(绝对经典,所有问题看这一篇足够了)

  3. wanghetao,Makefile选项CFLAGS,LDFLAGS,LIBS

  4. 隔壁王叔叔a,gcc -I -L -l区别

  5. makefile使用例子

以下文中与上面有相关联部分会用上标标识,更多信息会在原文中出现。

一、程序编译到执行文件过程1,2

编译过程

c/cpp首先会被编译成中间代码文件,win下为.obj文件,Unix/Linux下为.o文件,这个过程称为编译。

编译器在编译过程会进行语法检查,包括源文件语法的正确和函数与变量声明的准确。只要通过语法检查,就会生成.o文件。

链接过程

中间代码文件合成执行文件称为链接。
链接时主要是链接函数和全局变量,也就是将中间/目标文件链接生成可执行的应用程序,链接器只会去把.o文件进行链接。
不过在很多时候由于源文件太多,生成的.o文件也就会很多,这个时候难以编译,解决方法是将.o文件打包,windows下打包成库文件/lib,Linux下打包为归档/archive文件,.a文件。

二、我们需要理解的编译器内容

GCC、G++、GDB

GCC是用于对C语言进行编译,G++是CPP的编译器,GDB是调试工具。
这里主要介绍GCC的功能。

GCC 选项

我们或许可以看到一个较为复杂的gcc类似如下形式:

gcc -o main aa.c xx.o x2.o ar.a -lpthread -L /home/xxx/xx -I /home/xxx/xxhead

编译相关选项

  • -c: 编译,生成.o文件
  • -o: 生成可执行文件

GCC添加库依赖(-l 和 -L)

  • -l: 依赖/usr/lib中的库,例如需要使用到libpthread.so的时候,就使用-lpthread即可。
  • -L:大L的区别在于使用自己生成的库,可以制定路径。使用的时候-l不需要空格,大L需要空格。

GCC添加头部依赖(-I)

当程序提示找不到相关头文件,找不到函数或者全局变量的时候,这个时候需要添加头文件位置,于是就可以使用-I directory。

更多内容可以访问gcc -I -L -l区别4

GDB 生成调试信息注意

调试程序需要有调试信息,调试信息自然是与源文件有关,所以为了让gdb能够成功读取符号表,需要在编译过程加上-g的选项:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值