1、静态库在编译时直接整合到目标程序中,这意味着静态库中的代码会被完整地复制到最终的可执行文件中。因此,使用静态库编译的程序不依赖于外部库文件,可以在没有安装这些库的机器上独立运行。既然如此,为什么还需要头文件?
=》因为:
静态库需要头文件的原因是因为:头文件提供了库中函数的声明,允许开发者在其他代码文件中调用这些函数,而无需关注函数实现的细节。
静态库(如Windows下的.lib文件或Linux下的.a文件)是编译后的二进制文件,它们包含了库函数的实际实现代码。然而,当其他开发者想要使用这些库函数时,他们需要知道这些函数的接口信息,包括函数名、参数类型、返回值类型等,以便正确地调用这些函数。这些接口信息就是通过头文件(.h文件)提供的。头文件包含了函数的声明,但不包含函数的实现代码,它主要起到描述性作用,使得多个代码文件可以共享全局变量和函数声明,避免定义冲突,并提高代码的模块化和可维护性12。
简而言之,如果没有头文件提供函数声明,其他开发者将无法正确地调用静态库中的函数,因为他们不知道如何正确地传递参数或调用这些函数。因此,为了使静态库能够被广泛使用和集成到各种项目中,提供头文件是必要的步骤之一。
2、
我们把公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序(exe)运行时将不再需要该静态库。(如果exe引用的只有静态库,可以直接将exe拷贝给客户使用。)
动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才和可执行程序一起被载入内存,因此在可执行程序(exe)运行时还需要动态库同时存在。(如果exe引用的有动态库,将exe拷贝给客户使用的时候,必须要给动态库一起拷贝过去。不然exe无法正常打开使用)
3、使用与区别
静态库使用:头文件放到一个名为include的目录下,将生成的静态库文件放到一个lib目录下,然后将这2个目录都放到一个文件夹下,此时就可以将“这个文件夹”给别人使用了;
动态库使用:头文件放到一个名为include的目录下,将生成的动态库文件放到一个dll目录下,然后还有一个动态库的导入库lib文件,放到lib目录下,将这3个目录都放到一个文件夹下,此时就可以将“这个文件夹”给别人使用了;
这里可能有个疑问,动态库怎么还有一个DynamicLibrary.lib文件?即无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢?其实,两个是完全不一样的东西。
StaticLibrary.lib的大小为190KB,DynamicLibrary.lib的大小为3KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫【导入库】。实际上静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。