03静态库补充对应头文件(防止隐式声明)
03静态库补充对应头文件(防止隐式声明)
前提:
1)隐式声明:调用其它函数前,被调用的函数没有在调用函数的前面进行定义或者声明。
1 静态库为何需要制作头文件
按照上一篇的代码执行以下命令:
上面可以看到出现了带行号的警告(带行号一般说明是编译时出的错误,有collect一般是链接出错),警告报出隐式声明,编译器支持隐式声明,它会自动帮你默认生成返回值为int 函数名和参数类型按照你传参时的值生成,所以隐式生成的声明为"int add(int,int)";
但是,如果我静态库的函数原型为void呢,它也会生成int,肯定会报错,所以这是不行的,那么如何解决?就是添加头文件了。
2 将静态库的函数声明,利用一个文件进行封装组成头文件。
1)先在当前路径新建一个xxx.h文件,然后将静态库中的函数声明按照头文件的定义格式放进去即可。
2)此时,我们在调用的函数中添加头文件后,再gcc编译就不会报出隐式声明的警告。
警告已经全部消失。
3 更改对应静态库和头文件的存放路径,养成好习惯。
1)将静态库放在新建的lib目录当中,当然路径可以按照你自己定义的路径。
2)将头文件放在自己新建的incl目录当中,同样是自定义路径,但是库与头文件最好分开。你也可以放在所有头文件的统一路径(Linux下)。
4 总结
上一篇只是怎么创建静态库,只有加上头文件和分配好对应的目录才是一套完整的操作。
这里写一次完整的步骤:
1)用"-c"将xxx.c文件生成xxx.o文件;
例如"gcc -c add.c (-o add.o)";此时就会生成add.o目标文件,括号不写默认也生成.o文件。
2)用"ar + rsc + 自定义静态库名字+xxx.o文件"生成静态库。静态库名字开头前三个字符必须为lib,后缀为.a。
例如"ar rsc libmymath.a add.o"。
3)使用静态库。 只需要在gcc编译时加上静态库名字即可。libmymath.a名字位置不要求。
例如"gcc add.c libmymath.a -o add"。
4)添加头文件
5)更改库与头文件到自己想要的路径,方便以后管理。