一直没理解清楚dll,lib,h文件的关系,该怎么处理
一直没理解清楚dll,lib,.h文件的关系
没做过什么真实的C++项目,都是看点C++的书,写点只有一个main函数,顶多加几个类的代码。
首先介绍下我的环境,vc10,qt库
这次是要用到一个开源的库,官网上下载下来只有一堆DLL,没有.h,也没有lib,只是有api文档。
在网上查了一些关于dll的资料,说是dll一定要有lib,这样才能定位函数地址,否则只能load再get地址,我想这样操作还是有点麻烦,毕竟每使用一个函数都要get一下地址。
而我将要使用的dll拷到了自己在项目中,并在链接处指定了目录,然后在使用中先include h文件,再直接根据api文档调用我想要的类和函数即可实现。
但是我还想搞明白dll,lib,.h这三者在一个C++工程中的关系是怎么样的,
因为在网上实在没有找到很明白的解释。
为什么dll可以有lib,也可以没有lib,有什么区别?
.h文件是调用dll一定要用到的么?
dll既可以是静态库又可以是动态库么?
因为我看了《linux程序设计》一书中的描述,.a就是静态,.so就是动态。
windows下还真麻烦呢
看了我问的这些问题,看贴人也能看得出来我的理解还比较混乱,希望有时间的同时能够讲解一下,或者能给个你认为比较好的资料的链接,不要跟mfc沾边的,我不用那东西。谢谢,如果认为分不够可以再加。
------解决方案--------------------
是我还想搞明白dll,lib,.h这三者在一个C++工程中的关系是怎么样的?
A dll里面装的是和可执行文件一样的二进制码是直接可以载入内存执行的,lib后辍的文件有两种而这两种的功能又大不相同,一种叫静态库和前面的dll动态库对应,我觉得它里面装的应该也是可执行代码和dll一样和dll不一样的是它是在生成可执行文件的链接过程中被链入(有点像复制)exe的有点像目标文件被链接成exe,另一种lib叫引入库文件,这个是用来使用动态库的,lib里面包含了dll中函数的地址这样就不用LoadLibrary,GetProcAddress了,当然头文件就是定义函数原型,编译器好为调用准备参数。
为什么dll可以有lib,也可以没有lib,有什么区别?
A 有lib的都可以没有dll,没有了lib记录函数的地址,可以用api LoadLibrary GetProcAddress来代替。
.h文件是调用dll一定要用到的么?
A 一定要知道要不然的话怎么传参数?
dll既可以是静态库又可以是动态库么?
A 静态库被链接进可执行文件,动态库不会直接进入地址空间而是映射,所以动态库省空间,而且替换方便,dll这个后辍一般用作动态库,静态库是lib。
------解决方案--------------------
dll是动态库, 将其链接进工程, 一般用LoadLibrary, GetProcAddress调用里面导出的函数(api文档);
lib是静态库, 将其链接进工程, 调用时需要包含一个头文件, 具体实现放在lib里了;
.h头文件, 实现放在.c或.cpp里
------解决方案--------------------
windows下的dll还有导入库,扩展名也为LIB,但不是静态库
------解决方案--------------------
《程序员的自我修养——链接、装载与库》
------解决方案--------------------
.h 代码中包含
.lib VC directory 要给出那些.lib 文件的物理位置
.dll 放在系统文件夹(system32)或者exe同一个文件夹,这样程序可以正常运行
------解决方案--------------------
一楼回答的不错,如果你看了《程序员的自我修养——链接、装载与库》这本书,上面的问题都会迎刃而解,不过这本书有点难,讲底层具体实现的比较多,我买了,看的很痛苦
------解决方案--------------------
DLL如果是动态加载的,既不需要.H也不需要.LIB,如果是静态的,则需要.H和.LIB!
------解决方案--------------------
那库既然是开源的,你又何愁得不到.h和.lib呢?
网上有dlltolib工具可逆向到.h和.lib,试试看.
------解决方案--------------------
我说个几句话你就明白了,话说lz你废话也太多了
dll库里面放api函数,比如loadlibrary,exitprocess等等
lib文件是静态库,顾名思义,就是在link的时候要放进exe里面去的东西,为嘛dll都已经加载入内存了,link的时候还要lib的信息呢,因为我的exe要调用的api在内存中的位置不确定,而lib库就是为确定api在内存中的位置服务的
.h文件嘛,定义数据结构用的,c/c++ is static type language,so everything must be defined before using them。
懂了没?
------解决方案--------------------
dll动态库,软件运行时加载它,lib静态库,编译时把用到的内容加载到软件里了,.h是桥梁,定义了你想用的函数,帮你连接到库里
没做过什么真实的C++项目,都是看点C++的书,写点只有一个main函数,顶多加几个类的代码。
首先介绍下我的环境,vc10,qt库
这次是要用到一个开源的库,官网上下载下来只有一堆DLL,没有.h,也没有lib,只是有api文档。
在网上查了一些关于dll的资料,说是dll一定要有lib,这样才能定位函数地址,否则只能load再get地址,我想这样操作还是有点麻烦,毕竟每使用一个函数都要get一下地址。
而我将要使用的dll拷到了自己在项目中,并在链接处指定了目录,然后在使用中先include h文件,再直接根据api文档调用我想要的类和函数即可实现。
但是我还想搞明白dll,lib,.h这三者在一个C++工程中的关系是怎么样的,
因为在网上实在没有找到很明白的解释。
为什么dll可以有lib,也可以没有lib,有什么区别?
.h文件是调用dll一定要用到的么?
dll既可以是静态库又可以是动态库么?
因为我看了《linux程序设计》一书中的描述,.a就是静态,.so就是动态。
windows下还真麻烦呢
看了我问的这些问题,看贴人也能看得出来我的理解还比较混乱,希望有时间的同时能够讲解一下,或者能给个你认为比较好的资料的链接,不要跟mfc沾边的,我不用那东西。谢谢,如果认为分不够可以再加。
------解决方案--------------------
是我还想搞明白dll,lib,.h这三者在一个C++工程中的关系是怎么样的?
A dll里面装的是和可执行文件一样的二进制码是直接可以载入内存执行的,lib后辍的文件有两种而这两种的功能又大不相同,一种叫静态库和前面的dll动态库对应,我觉得它里面装的应该也是可执行代码和dll一样和dll不一样的是它是在生成可执行文件的链接过程中被链入(有点像复制)exe的有点像目标文件被链接成exe,另一种lib叫引入库文件,这个是用来使用动态库的,lib里面包含了dll中函数的地址这样就不用LoadLibrary,GetProcAddress了,当然头文件就是定义函数原型,编译器好为调用准备参数。
为什么dll可以有lib,也可以没有lib,有什么区别?
A 有lib的都可以没有dll,没有了lib记录函数的地址,可以用api LoadLibrary GetProcAddress来代替。
.h文件是调用dll一定要用到的么?
A 一定要知道要不然的话怎么传参数?
dll既可以是静态库又可以是动态库么?
A 静态库被链接进可执行文件,动态库不会直接进入地址空间而是映射,所以动态库省空间,而且替换方便,dll这个后辍一般用作动态库,静态库是lib。
------解决方案--------------------
dll是动态库, 将其链接进工程, 一般用LoadLibrary, GetProcAddress调用里面导出的函数(api文档);
lib是静态库, 将其链接进工程, 调用时需要包含一个头文件, 具体实现放在lib里了;
.h头文件, 实现放在.c或.cpp里
------解决方案--------------------
windows下的dll还有导入库,扩展名也为LIB,但不是静态库
------解决方案--------------------
《程序员的自我修养——链接、装载与库》
------解决方案--------------------
.h 代码中包含
.lib VC directory 要给出那些.lib 文件的物理位置
.dll 放在系统文件夹(system32)或者exe同一个文件夹,这样程序可以正常运行
------解决方案--------------------
一楼回答的不错,如果你看了《程序员的自我修养——链接、装载与库》这本书,上面的问题都会迎刃而解,不过这本书有点难,讲底层具体实现的比较多,我买了,看的很痛苦
------解决方案--------------------
DLL如果是动态加载的,既不需要.H也不需要.LIB,如果是静态的,则需要.H和.LIB!
------解决方案--------------------
那库既然是开源的,你又何愁得不到.h和.lib呢?
网上有dlltolib工具可逆向到.h和.lib,试试看.
------解决方案--------------------
我说个几句话你就明白了,话说lz你废话也太多了
dll库里面放api函数,比如loadlibrary,exitprocess等等
lib文件是静态库,顾名思义,就是在link的时候要放进exe里面去的东西,为嘛dll都已经加载入内存了,link的时候还要lib的信息呢,因为我的exe要调用的api在内存中的位置不确定,而lib库就是为确定api在内存中的位置服务的
.h文件嘛,定义数据结构用的,c/c++ is static type language,so everything must be defined before using them。
懂了没?
------解决方案--------------------
dll动态库,软件运行时加载它,lib静态库,编译时把用到的内容加载到软件里了,.h是桥梁,定义了你想用的函数,帮你连接到库里