C语言:多文件编程及Makefile使用
本文总结了C语言多文件编程的核心知识点:1)多文件结构由.h头文件(含宏定义、函数声明等)和.c源文件组成,使用#ifndef防止重复包含;2)Makefile工程管理工具的基本语法、变量定义和常用gcc编译选项;3)动态库(.so)与静态库(.a)的区别:静态库编译时加载会增加体积但独立运行,动态库运行时加载可共享但依赖存在。重点包括多文件组织、Makefile使用和库文件特性,为嵌入式开发提供
d目录
1.多文件编程结构组成
1.1示意图:

1.2各文件说明
.h文件
包含: #ifndef XXX.h //作用:防止头文件重复包含
#define XXX.h
头文件的引用
数据类型定义
宏定义
全局变量声明
全局函数声明
#endif
.c文件
包含: 功能实现代码
#include XXX.h //若此函数自身要用自己的东西则需包含对应的头文件
经验: 不让外部用的变量或者函数,在其前加static关键字
1.3文件夹
src 存放源文件
inc 存放源文件
build 存放生成的可执行程序
lib 存放库文件
1.4注意:
①include 的<>和“”的区别:
系统/第三方库 → 用
< >自己项目的文件 → 用
" " (∵优先在当前文件开始寻找,若没找到才去系统库找)
2. Makefile
2.1 简介:Makefile是一个工程管理工具,输入make,系统会查找当前目录下的Makefile文件,然后根据规则对代码进行编译
2.2 makefile语法:
要生成的文件:依赖的所有文件
生成规则#注释用#号
#“ 生成规则 ” 前面的空格为tab键
示例
2.3 makefile中的变量:
系统变量
$@ 要生成的文件
$< 第一个依赖的文件
$^ 所有依赖的文件,中间空格隔开
自定义变量
变量的定义
变量名 = 值
变量的使用
$(变量名)
或 ${变量名}
2.4 makefile中的赋值
= 赋值
:= 覆盖赋值 #与赋值符号=是等价的
+= 在原来值的基础上再加新的值
?= 原来没值,就赋值新值,原来有值,不会赋值新值
2.5伪指令
指令代码
注意:①.PHONY为伪指令开始标志,下边用户编写的clean、distclean、install、uninstall为伪指令
②使用方法:输入 sudo make 伪指令,再输入用户密码,按回车即可运行
2.6 gcc的编译选项
-E 完成预处理,编译成展开后C语言代码
-S 完成预处理、编译,编译成汇编代码
-c 完成预处理、编译、汇编,编译成二进制代码
-o 指定生成文件的名字
-I 指定头文件的路径
-L 指定库文件的路径
-l 指定链接库的名称
-Wall 取出编译器优化,打印所有告警信息
-O 设置编译优化级别
2.7 Makefile三个常用的格式替换函数
wildcard 查找指定目录下满足格式的文件
#遍历找到add目录下所有的.c文件放入SRCS变量中SRCs :=$(wildcard ./add/*.c)
patsubst 格式替换,根据格式将变量中的字符串完成替换
#将SRCS变量中所有的满足格式的.,格式替换为对应的.00B]s :=$(patsubst ./add/*.c,./build/*.0,$(SRCS))
notdir 去除文件路径,只留下文件名
#将SRCS变量中的所有文件去除路径,只留下文件名0BJs := $(notdir $(sRcs))
3.动态库和静态库
3.1库文件:
在链接时与源代码链接为一个可执行程序代码实现的二进制形式,
3.2 库文件分类:
1.静态库(lib库名.a)
1.在编译时加载到程序中
2.静态库会使代码体积增大
3.多个程序使用同一静态库,需要分别加载各自独立的静态库4.删除静态库不会对代码运行产生影响4.删除静态库不会对代码运行产生影响
2.动态库(lib库名.so)
1.在运行时加载到程序中
2.动态库不会使代码体积增大
3.多个程序可以使用通一动态库,节省代码体积4.删除动态库,代码将无法运行
总结:
今日的重点有:
①多文件编程的结构组成
② Makefile的基本概念,应用场景,使用方法
③动态库和静态库的特点及使用方法
今天的嵌入式自学笔记就到这儿啦~
C语言到此结束
更多推荐







所有评论(0)