头文件: .h 声明了库文件中包涵了哪些函数及调用接口
库文件: 提供了函数库的文件,有两种,一种是静态连接的(.a),需要在程序编译时连接;另一种是动态连接的(.o,.so),在程序运行时连接.
库函数: 在库文件里提供的函数,就可以称之为库函数吧.
===================================================
===================================================
Q:Linux下的C的库文件和头文件有什么区别?
如果按我的理解
头是声明
库是定义
但是为什么有的文件编译的时候还要特意连接一下库呢?
头是声明
库是定义
但是为什么有的文件编译的时候还要特意连接一下库呢?
A1:你看写makefile的时候 不都要连接一下吗?
可能是VC环境给我们都做好了,所以我们习惯了,但是在UNIX/LINUX下要指定好连接库,不然可能会出现你不希望看到的错误.
A2:Linux下的C库头文件 和 windows 下的差不多, 向ANSI C 靠拢. 要写得多一点, 例如 VC++ 可以省写 string.h, Linux下 要写.
链接时要指定库名,例如数学库.
库是 obj (*.o) 文件的集合体.
头是 宏,原型等
特意连接 -- VC,TC 也需要, 不过 VC,TC编译器安装时做好了环境.
Linux / unix 是开放性的,允许链接各式各样外来库--更多,更复杂.不象VC,TC是"排它"的,单一链接自己库. 所以 VC,TC 可以预知预设.
链接时要指定库名,例如数学库.
库是 obj (*.o) 文件的集合体.
头是 宏,原型等
特意连接 -- VC,TC 也需要, 不过 VC,TC编译器安装时做好了环境.
Linux / unix 是开放性的,允许链接各式各样外来库--更多,更复杂.不象VC,TC是"排它"的,单一链接自己库. 所以 VC,TC 可以预知预设.
==========================================
==========================================
Q:标准库函数为什么只有头文件呢?
我们一般写类的时候,都把类的声明放在头文件里面,把类的定义写在一个cpp文件里面。那么标准的库函数如iostream.h,里面的东西乱七八糟的看都看不懂,它是把类的定义也放在头文件里面了吗?
A:
头文件中存放的只是函数的声明部分,真正的实现部分在与相应头文件同名的.lib文件中,在程序编译时才联编进目标文件的。
=========================================
头文件里有的只不过是声明而已,实现文件早已编译成 .Obj文件了,只有在LINK的时候才用到它们。
头文件里只是多包含了几个预编译符,跟一般的文件声明是一样
头文件里只是多包含了几个预编译符,跟一般的文件声明是一样
=========================================
C++的标准函数实现就直接在头文件里。不相你打开STL的文件来看看,根本就不是编译成库的形式,因为他们都是用template技术实现的,必须在编译时再实作出实现了,怎么可能预编译好的呢?你搜搜自己的电脑上有iostream.lib这个文件吗?
C里面的函数库是用.h公开声明,然后用.lib提供实现,但是C++中并非完全如此。
C里面的函数库是用.h公开声明,然后用.lib提供实现,但是C++中并非完全如此。
c++的编译器,在预处理的时候,根据头文件名字在默认的include所在路径的中查找匹配的头文件,如果存在这个文件,则编译器在根据这个头文件里面的函数声明对比,确定源代码中所使用的函数有效性,如果有效,则编译器根据该头文件自啊默认的librarypath中查找对应的库,(一般的库文件都是规律的以lib+部分头文件名表示,)找到之后,将对应的函数定义,加入到源代码中,完成预处理操作。 这一点在linux下的g++ 体现的很明显 在linux下 执行 g++ -v就能看到基本路径的默认配置了 不过静态库和动态库是不一样的,上面那种状态只是适合静态库, 动态库的话,并不会将函数完整加入到源代码中,而是以接口的方式存在,在运行时候,自动调用动态库中的函数。