dll编译lib
❶ C++中lib 和 dll 的区别,生成以及使用详解
首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件
动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件
那么上述静态库和动态库中的lib有什么区别呢?
静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中
动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供
总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
❷ 如何从动态库DLL生成静态的LIB并使用
在VS中创建一个解决方案,解决方案中包含一个库项目,其余所有的项目依赖这个库项目,并且调用这个库项目中的特定函数
/
LibProject/
UseLibProjectA/
UseLibProjectB/
知识准备
这样的依赖关系可以采用静态依赖库lib和动态依赖库dll实现,博主【技术先生】的一篇博客 1
简明的阐述了两者的区别,这里采用了静态链接库的方式。
操作过程
建立库项目
这里选用 [Visual C++] ->[空项目]
修改项目属性,[属性]->[配置属性]->[常规]->[项目默认值]->[配置类型]->[动态库(.dll)]
创建头文件
宏定义部分根据预编译宏来区分编译操作源自dll项目还是使用dll的项目
所有的可能会被外部使用的变量或者方法都需要被[TESTDEPEND_API ]标注出来,博主曾经因为忘记把类默认初始方法标注出来而导致编译失败- #pragma once//TESTDEPEND_EXPORTS 这个宏名称可以自由定义,#ifdef TESTDEPEND_EXPORTS #define TESTDEPEND_API __declspec(dllexport) #else #define TESTDEPEND_API __declspec(dllimport) #endif #include <string>class A {public: TESTDEPEND_API A(); TESTDEPEND_API void hello(std::string name);private : int c; int b;
- };123456789101112131415161718
生成方法实例
- #include "A.h"#include <iostream>A::A() : b(1),c(2){}void A::hello(std::string name) { std::cout << b - c << "-hello-" << name << std::endl;}1234567891011
添加编译宏。 [属性]->[配置属性]->[C/C++]->[预编译器]->[预编译器定义] 添加TESTDEPEND_EXPORTS
这里选用 [Visual C++] ->[空项目]
包含头文件, [属性]->[配置属性]->[VC ++目录]->[包含目录] 添加对应文件(.h)的路径,如果可能的话,还是最好添加相对路径,便于迁移
包含库文件路径, [属性]->[配置属性]->[VC ++目录]->[库目录] 添加对应文件(.lib)的路径
添加链接选项, [属性]->[配置属性]->[链接器]->[输入] 添加对应文件(.lib)的名称 e.g TestDepend.lib
这一步是偷懒的操作,这样添加的链接选项会针对每一个需要链接的文件生效,我们可以不配这一步,取而代之,我们在需要链接库文件的地方写下如下预编译选项
#pragma comment (lib,"TestDepend.lib")在项目中需要的地方调用库文件的内容
- //上面是对应的库的头文件名称#include "A.h"//如果不在链接器的输入中添加lib文件名,则需要按下面一行的方式配置//#pragma comment (lib,"TestDepend.lib")int main() { A a;
- a.hello("t1");
- a.hello("t2"); return 0;
- }12345678910111213
编译并运行,项目运行成功
在项目发布的时候我们需要将库文件的lib和可执行文件exe放在同级目录,lib文件则不需要了
至此为止,库项目创建完毕,我们可以直接编译一遍该项目,根据默认配置,会在指定生成路径下生成与项目名称同名的dll和lib 文件。
我们可以采用VS自带的Dumpbin.exe 程序(在VS安装目录可以检索到)检查一下生成的dll文件中的内容,操作参考fengbingchun的博客 2 ,这个输出的信息还是很难阅读的,但是导出的方法名和相应的参数名还是可以清晰的推断出来,我们可以人工检查一下输出的方法是否和预期一致。
从其他项目中调用库
❸ 如何由dll文件生成lib文件
�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 操作系统:windows �0�2�0�2�0�2 编程工具:visual c++ �0�2�0�2�0�2 水平:刚入门(yijiong shi)�0�2 �0�2�0�2�0�2 �0�2�0�2�0�2�0�2 .lib有两种,一种是静态的,其中包括函数的实际代码, 一种是由DLL生成的.lib,其中并不包含代码, 只是包含DLL的链接信息。只有前一种才存在你说的转换问题。 另外一点要看.lib中的内容,如果是普通的c语言函数, 可以转换,如果是C++类,则不能直接转换为DLL, 因为即使你直接编译为DLL,也只有VC的程序才能使用( 那何必费这事),即使C++ Builder也不能调用,你必须把类转换为普通的C语言函数,
❹ 如何通过dll文件生成对应的lib文件
方法/步骤
1
这里我用的是vs2008,网络下载vs2008,然后安装,安装界面如下图所示。
2
安装完成后是配置软件的PATH,如下图所示,右击选择“属性”。
3
在弹出的窗口中选择“高级系统设置”,如下图所示。
4
然后如下图所示,点击“环境变量”。
5
在系统变量一栏中找到PATH,双击后就可以修改了。
6
在弹出的编辑窗口中输入vc的bin路径,然后保存退出。
7
打开windows下的控制台窗口CMD,进入到Dll所在的路径。
8
执行以下命令生成一个def文件:
pexports mydll.dll -o > mydll.def
9
最后执行以下命令就可以生成一个lib文件了:
lib /machine:ix86 /def:mylib.def
❺ 如何在编译器里设置调用别人写好的lib和dll步骤
步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径
(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.)
(若不设置,编译报错:无法打开***文件)
2.Project->properties->c/c++->general->additional include directories 添加包含文件
Project->properties->linker->general->additional library directories 添加库文件
Project->properties->linker->input->additional additional dependencies添加用到的lib
(这一步也可以在代码中显示调用 #pragma comment(lib, "***.lib") )
(若不添加,连接报错:无法解析的外部符号)
3.将dll文件拷贝到工程debug文件下(如果不拷贝,编译链接不报错,运行报错:无法找到***.dll)切记第三条,让老子排查了一上午,当然最好把所有输出目录定位到一个文件下面。
附:
DLL与LIB文件的区别
共有两种库:
一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接 库dynamic link library。
一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:
动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定 位DLL函数的可执行代码所需的信息。
静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件 中。
关于lib和dll的区别如下:
(1)lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运行起来,只需要dll。
(2)如果有dll文件,那么lib一般是一些索引信息,记录了dll中函数的入口和位 置,dll中是函数的具体内容;如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。使用静态编译的lib文件,在运行程序时 不需要再挂动态库,缺点是导致应用程序比较大,而且失去了动态库的灵活性,发布新版本时要发布新的应用程序才行。
(3)动态链接的情况下,有两个 文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL 文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序 一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
使用lib需注意两个文件:
(1).h头文件,包含 lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
(2).LIB文件,略。
使 用dll需注意三个文件:
(1).h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含 入应用程序的源文件中。
(2).LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用 程序,否则产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。
(3).dll文件,真正的可执行文件,开发成功后的应用 程序在发布时,只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件
望采纳
❻ 关于c语言 dll文件和lib文件的问题
静态链接 lib文件的二进制代码最终要链接植入你的exe中
动态链接 dll文件内的二进制代码不会植入你的exe中
静态编译 如果lib文件 的源码修改了 编译生成新的lib文件 那么
新的lib文件要和你的源码编译得到的obj文件重新链接生成 新的exe
之前的exe就可以扔进回收站了
动态编译 dll 的源码修改了 重新编译生成新的dll (dll的调用接口 保持不变)
你的源文件编译 obj文件后链接生成exe exe是动态链接调用dll 的所以 你的源码不需要重编译 你的exe依然可以用,你要做的只是 过来替换一下 n个dll中发生变动的那k个 ,
❼ dll工程中如何生成lib文件
解决办法:
在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加
重新编译编译就可生成.lib 文件了,
之后把添加的文件删除就可以了.
❽ 如何通过dll文件生成对应的lib文件
通过dll文件生成对应的lib文件的方法
这里我用的是vs2008,网络下载vs2008,然后安装。
安装完成后是配置软件的PATH,如下图所示,右击选择“属性”。
在弹出的窗口中选择“高级系统设置”,如下图所示。
然后如下图所示,点击“环境变量”。
在系统变量一栏中找到PATH,双击后就可以修改了。
在弹出的编辑窗口中输入vc的bin路径,然后保存退出。
打开windows下的控制台窗口CMD,进入到Dll所在的路径。
执行以下命令生成一个def文件:pexports mydll.dll -o > mydll.def
最后执行以下命令就可以生成一个lib文件了:lib /machine:ix86 /def:mylib.def
❾ 如何由dll文件生成lib文件
编号: QA004062�0�2�0�2�0�2�0�2�0�2所属类别: C/C++ - 其他方面
�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2 操作系统:windows
�0�2�0�2�0�2 编程工具:visual c++
�0�2�0�2�0�2 水平:刚入门(yijiong shi)�0�2
�0�2�0�2�0�2
�0�2�0�2�0�2�0�2 .lib有两种,一种是静态的,其中包括函数的实际代码,
一种是由DLL生成的.lib,其中并不包含代码,
只是包含DLL的链接信息。只有前一种才存在你说的转换问题。
另外一点要看.lib中的内容,如果是普通的C语言函数,
可以转换,如果是C++类,则不能直接转换为DLL,
因为即使你直接编译为DLL,也只有VC的程序才能使用(
那何必费这事),即使C++ Builder也不能调用,你必须把类转换为普通的C语言函数,
你可以参考QA000072 VB和VC混合编程中编写DLL的方法。
❿ vc如何在命令行方式下将dll转换为lib(我真
因为采集卡的dll不支持CLR,不支持C#,你需要用C++,并用静态链接,也就是你需要包含.h和.lib文件。 你试用一下TlbImp.exe吧,这是VS2005以上安装的一个工具,你可以在文件搜索里把它找出来。然后用命令行把你所需的dll文件转换为支持CLR、支持C#的dll文件,你在C#就可以添加这个dll了。具体用法可以用 TlbImp.exe -help 命令查看。