一 宏定义
#undef 宏名称 //取消宏定义
1,带参宏(定义的是函数)
#define 宏名称 (参数) 代码
如:
与函数的区别;(建议使用函数)
带参宏
节省时间 浪费空间(将代码直接在预编译后替换回.c文件中,直接挨个执行)
函数
节省空间 浪费时间 (将函数压栈一层层调用函数,代码量少,但是每次都得调用)
2,不带参宏(定义的是值)
方式一: 静态定义
#define 宏名称 值
如:#define pei 3.141592678
方式二: 动态定义
在编译时定义宏
gcc 源文件名 -o 生成的可执行文件名 -D 宏名称 值
如: gcc test.c -o test -D pei 3.141592678
二 选择性编译
语法结构与if else相似
头文件模板
在.h头文件中,引入选择性编译,用上述模板嵌套声明和结构体,可以在多次掉用这个.h头文件时,防止头文件多次重复展开
三 动态库与静态库
静态编译使用静态库
动态编译使用编译库
1.静态库
制作静态库:
注意:静态库名必须要以lib开头,以.a后缀名结尾
1.将所有要编译为库文件的.c文件编译为二进制.o文件
命令:
gcc -c 源文件.c -o 二进制文件名.o
2.将所有二进制文件.o生成库文件
命令:
ar rc 静态库名.a 二进制文件.o
使用静态库:
1.库和源文件在同一个目录下
命令:
gcc -c -static 源文件 静态库名.a -o 可执行文件
2.库和源文件在不同目录下(大多数情况)
注意:
-L库文件所在的文件地址
-l(小写L)库文件名(去掉lib前缀和.a后缀)
-I(大写i)静态库所在头文件位置(-L-l-i与后面的地址之间没有空格)
命令:
gcc -static 源文件.c -L库文件所在的文件地址 -l库文件名 -I静态库所在头文件位置
3.库和头文件都存放在系统目录下
注意:
库文件的默认路径是/lib 或者是/user/lib 头文件的默认路径是/user/include
如果要测试,要将自己制作的库函数移动到以上两个目录中
命令:
gcc -static 源文件.c -l库文件名 -o 可执行文件名
注意: -l(小写L)库文件名(去掉lib前缀和.a后缀)
2.动态库
制作动态库:
1.将所有要编译为库文件的.c文件编译为二进制.o文件
命令:
gcc -shared 源文件.c -o 二进制文件名.so
注意:可能会报错:
解决在上述命令中加入参数-fPIC
gcc -shared -fPIC 源文件.c -o 二进制文件名.so
使用动态库:
1.库和源文件在同一个目录下
命令:
gcc 源文件 lib动态库名.so -o 可执行文件
2.库和源文件不在同一个目录下
gcc 源文件名 -o 生成的可执行文件名 -L 库文件所在位置 -l 库文件名 -I 头文件所在位置 (注意:此时库文件名不要加后缀)
3.在系统路径下
gcc 源文件 -o 可执行文件 -l库名称 (注意:此时生成动态库时名称前必须加lib)
注意:在运行时可能会报错:
解决方法:
在控制台输入以下:
export LD_LIBRARY_PATH=库文件所在目录:$LD_LIBRARY_PATH 如: export
LD_LIBRARY_PATH=/home/edu/share/day08/11_code:$LD_LIBRARY_PATH