根据头文件找函数的实现,先找静态库,再找动态库
c++20实现import
#include 与define类似,就是把.h文件中的字符串复制一份到.cpp中,所以要注意.h中尽量只声明函数,不要定义函数,不然会出现重复定义的错误。解决方法:#ifndef #define
声明的作用
告诉编译器某个未定义的函数的类型,从而方便编译通过,生成.o文件,.o文件里会有这些未定义的函数的符号表。链接器会根据符号表从.so或者.a库中找到函数定义并生成可执行程序。
c和cpp编译器只能编译一个文件,生成.o文件,n个文件的程序会生成n个.o文件,然后把这n个文件链接到一起生成一个大的.o文件,然后再链接外部库,最终生成可执行程序。
java python等都是直接在编译阶段找到函数定义然后直接生成可执行程序。cpp不这么做主要是历史遗留问题,当时编写一个程序可能是用不同语言编写的,为了把不同语言的的文件结合成一个程序,需要先编译生成二进制.o文件,然后统一链接。
插件原理
类的多态,运行时根据主体程序中的符号表和和路径,从而定位不同动态库。
插件需要头文件的原因:
主程序能够调用未实现头文件,可以编译通过
extern表面已经声明了
源文件编译成.o后会带符号表,符号表里有类名的字符串,
声明是告诉编译器这个名字是什么类型,是函数,还是类 还是其他
定义是为这个名字分配存储空间
声明和定义有可能在同一个地方,也有可能在不同地方
首先,声明是必须的。
在代码中引用一个名字时编译器首先需要知道这个名字的具体类型,以便生成相应的指令,不然会引起混淆。
所以如果多个文件引用同一个名字,在每个文件中都需要有声明。
其次,定义只能有一个。
由于定义需要分配存储空间,多次定义会导致多次空间分配。
基于以上两点原因:声明需要有多个,而定义只能有一个,所以要把声明和定义分开。