楼主:
LPH66 (-6.2598534e+18f)
2015-08-05 23:13:59以下还是引用我在 C_and_CPP 版用过的比喻
解释写在 [] 里面
※ 引述《Orilla (企鹅 有股无比的魅力)》之铭言:
: 最近在看C
: 有些地方不太懂
: 希望知道的大大们帮解惑一下
: GOOGLE过
: 1.
: header file是说里面可能有一些常数 函式的架构
: 是不是因为它只是一个骨架 所以还要用.cpp档去定义实体的运作内容??
header file 像是一个电路元件的说明书
里面有说什么元件要用什么方式留接头 [什么函式要用什么方式呼叫]
函数的实作(.cpp)则是那个元件本身
在各自组装完成之后再把元件跟接头焊起来 [连结器的连结功能]
这样就是一个完整可用的电路了
这些元件都会以功能做为分类, 每个分类就是元件库
[就是常听到的 library, 函式库, .lib 档案]
要用什么元件就去什么元件库里找, 当然也要记得查说明书知道怎么留接头
[函式库都有随附的 header file 表示里面的函式要如何呼叫]
有的时候所连结的元件是默认就会帮你焊起来的那一包标准元件
[例如 C Runtime Library, 常用数学函式, 等等这些东西]
这时候不用指定也会去那一个元件库里找元件
[即是所谓"预先连结的函式库", VC++ 里它是以 libc 开头的 .lib 档案]
否则必须要指定对应的元件库, 这样才找得到正确的元件
[即是在连结器指定连结哪些函式库的参数]
: 2.
: DLL在撰写的过程 好像也是要编写.h档 然后用.cpp档去写里面的运作内容??
: 然后在写自己想要的程式时 看到都是要把该DLL的.h include进来才能用该DLL的功能
: 那DLL和header file不就一样吗?? 还是我哪边没弄懂??
: 还有 如果程式语言不同 为什么DLL档可以互相引用??
: 3.
: 查到.lib和DLL档有关连 但是不懂之间有什么关联
: 是说.lib档是把一堆DLL档整合在一起吗??
DLL 就是一包随插即用的元件库
它的接头比较不一样, 不是用焊的而是做成插头插上去
[这个"插座"叫做 GetProcAddress, "插头"则是所谓的 export function]
因此呼叫时需要做出对应的插座才能使用
不过在制作 DLL 时也可以附带做出公版插座给要用的人自己焊
[这即是你 3. 在问的 .lib 的内容, 里面就是包含了自动生成的 GetProcAddress]
当然就算是公版插座, 东西还是有一定的焊法
所以当然也会有说明书表示要怎么焊上这个插座
[即是 .dll 所随附的 header file]
因此你所焊上去的是这个公版插头, 实际的元件则是在执行时找出来插上去
[执行时寻找对应的 dll 加载函式]
也因为是执行时才找出来, 所以可以直接把元件包整包换掉 [抽换 dll]
只要插头还是对的就能够插上去用
同样的原因, 用这个元件的人跟元件本身是由不同人以不同方式制作也没有关系
只要插头插得上去就行了
[使用者跟 dll 使用不同语言写作也是没问题的, 只要 ABI 接口有对上即可]
: 4.
: API网络上有说是一种概念
: 如果自己要撰写程式 使用API来创造自己想要的功能或取得第三方的资讯
: 是不是只能使用第三方指定的软件去开发
: 还是说可以用所有的软件开发 然后用DLL去连结就可以??(第二题的问题之一)
: 谢谢各位了解的大大们不吝惜教导
: 先在这边感谢
API 是比较高阶的概念
它是属于我的系统要用什么架构下去运作的设计概念
像是你要用别人设计好的板子
要怎么去跟板子沟通传输资料表示你要做的事情这些就是这块板子的 API
因此其中的的函式呼叫跟资料结构什么的都是操作细节
重要的是整个系统的概念
那因为整套系统是绑在一起的, 自然就会将整个系统的函式制作成 lib 或 dll
让其他人直接把这一整包系统拉进他要写的东西里面去
(有些更大一点的系统还会分门别类打包
某些类别的系统包在一个档案里, 这样没用到这个系统就可以不用拉它进来)
有的系统会提供一些比较方便使用这套系统的人进行开发的工具
但这并不表示你一定要用它的工具进行开发