先谢谢cppblog的各位指教.

链接到静态库(*.lib)很简单,不多说.链接到DLL动态库分隐式链接和显式链接,显式链接较复杂,请参考MSDN这里学习一下隐式链接.

为隐式链接到 DLL,可执行文件必须从 DLL 的提供程序获取下列各项:

  1. 包含导出函数和/或 C++ 类的声明的头文件(.H 文件)
  2. 要链接的导入库(.LIB files)。(生成 DLL 时链接器创建导入库。)
  3. 实际的 DLL(.DLL 文件)

隐式链接需要一个由动态连接库产生的.LIB文件(导入库),并把它链接到应用程序的工程中.该导入库仅包含加载DLL的代码和实现DLL函数调用的代码。在导入库中找到外部函数后,会通知链接器此函数的代码在DLL中。要解析对DLL的外部引用,链接器只需向可执行文件中添加信息,通知系统在进程启动时应在何处查找 DLL 代码。

系统启动包含动态链接引用的程序时,它使用程序的可执行文件中的信息定位所需的DLL。如果系统无法定位DLL,它将终止进程并显示一个对话框来报告错误。如果找到了DLL,系统将DLL模块映射到进程的地址空间中。与程序代码的其余部分一样,DLL代码在进程启动时映射到进程的地址空间中,且仅当需要时才加载到内存中。

Windows将遵循下面的搜索顺序来定位DLL

  1. 包含EXE文件的目录
  2. 进程的当前工作目录
  3. Windows系统目录(system/system32)。GetSystemDirectory 函数检索此目录的路径。
  4. Windows目录.GetWindowsDirectory 函数检索此目录的路径。
  5. 列在Path环境变量中的一系列目录

现在的问题是如何从DLL生成导入库.这需要用到LIB命令行实用程序(在目录Microsoft Visual Studio .NET 2003\Vc7\bin中)和.DEF文件(dll一般提供了),下面我以sqlite3_2_2的dll为例.

[注意] 注意
如果运行时出现 缺少 mspdb71.dll 这个文件,那么进入这个目录:Microsoft Visual Studio .NET 2003\Common7\IDE 可找到这文件,将这文件拷贝到\Microsoft Visual Studio .NET 2003\Vc7\bin 即可。

将lib.exe所在的目录添加到环境变量path,在sqlite3.def所在目录下运行 lib /DEF:sqlite3.def /MACHINE:X86/MACHINE:X86参数是指定机器的类型,可以用lib /?查找帮助.现在应该生产了sqlite3.exp和sqlite3.lib两个文件.

导出 (.exp) 文件包含有关导出函数和数据项的信息。我们还用不到.现在把sqlite3.dll复制到windows\system32目录下,写test一个程序,链接到sqlite3.lib,Ok可以使用了

如果是是你自己建的DLL项目,在vs2003中DLL导入库的创建很简单(nanami指点,没有验证):

  1. 选择主菜单 项目->属性
  2. 选择 “链接器->高级->导入库”,然后输入一个以.lib结尾的文件名。默认一般可以用Marko设置成$(OutDir)/$ (ProjectName).lib。记得,Debug配置和Release配置都要设置。生成的导入库.lib会在和生成的DLL在同一个目录下。
  3. 在你需要调用DLL的项目里,将.lib文件加入到附加依赖项里,当然也要设置一下附加库目录~.~OK,大功告成了
posted on 2005-11-28 22:36 张沈鹏 阅读(2401) 评论(8)  编辑 收藏 引用
Comments
  • # re: 怎么链接到动态链接库呢?
    很土
    Posted @ 2005-11-29 08:45
    虽然问问题不是blog的主要功能,不过既然你问了,我就回答了.
    查看 LoadLibrary GetProcAddress这两个函数用法
    另外 你的用词不对,静态链接是指link之后不需要额外的dll,
    动态链接是指link之后,运行时需要相应的dll
    不需要用书,这种基础问题,msdn中全部都有.  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    Tech
    Posted @ 2005-11-29 09:24
    read <WINDOWS核心编程> for more....  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    socketref
    Posted @ 2005-11-29 09:54
    最简单的方法是用dllib工具,产生此dll的库描述文件 *.lib,然后你引用这个lib文件就可以了  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    空明流转
    Posted @ 2005-11-29 09:55
    还有就是,可以从dll中导出lib,进行隐式连接  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    张沈鹏
    Posted @ 2005-11-29 15:24
    谢谢各位的指教,问题已经基本解决(还有一个残留问题请见文章结尾) .  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    nanami
    Posted @ 2005-11-29 21:36
    DLL导入库的创建很简单:

    首先打开你的DLL项目:
    1。 选择主菜单 项目->属性
    2。 选择 “链接器->高级->导入库”,然后输入一个以.lib结尾的文件名。默认一般可以用Marko设置成$(OutDir)/$(ProjectName).lib。记得,Debug配置和Release配置都要设置。生成的导入库.lib会在和生成的DLL在同一个目录下。
    3。在你需要调用DLL的项目里,将.lib文件加入到附加依赖项里,当然也要设置一下附加库目录~.~

    OK,大功告成了  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    sooft
    Posted @ 2006-04-23 02:27
    不知道通过dll && lib能不能生成.h ? 只有.lib && .dll恐怕编译会通不过吧  回复  更多评论   
  • # re: 怎么链接到动态链接库呢?
    me
    Posted @ 2006-04-24 11:04
    不行吧  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理