【问题标题】:Statically including dll files静态包含dll文件
【发布时间】:2011-01-13 13:20:09
【问题描述】:

我在将 dll 文件静态链接到项目时遇到问题。我正在使用 Builder C++ 6。

I've unchecked:
Project \ Options \ Packages -> Build with runtime packages
Project \ Options \ Linker -> Use dynamic RTL
Project \ Options \ CodeGuard -> CodeGuard Validation

I've also added dll files using Project Manager:
myProject \ Add -> myFile.dll

当然,我已经在所有更改后重建了项目,它仍然在运行时要求一些 dll 文件。我遗漏了什么?

【问题讨论】:

  • DLL 代表 Dynamic-link 库。

标签: c++ build c++builder


【解决方案1】:

您不能像这样链接到 DLL。您需要先创建一个 .LIB,然后链接到该文件。

如果您无法创建 .LIB,则可以使用 .DEF。阅读this 或谷歌。

(顺便说一句:Builder C++ 具有与 MSDN 上相同或相似名称的工具)

【讨论】:

    【解决方案2】:

    当您静态链接到 DLL 时,真正发生的是编译器检测您的代码正在调用哪些 DLL 函数并设置存根指针,然后链接器将这些存根指针插入到应用程序的 IMPORTS 表中。在运行时,当您的应用程序运行时,操作系统加载程序将首先通过将引用的 DLL 加载到内存中来修补 IMPORTS 表(以及其他),然后根据需要更新函数指针。这发生在应用程序内的任何代码开始运行之前。如果加载器无法解析引用,它将显示错误并终止进程。 DLL 本身不会编译到应用程序本身中。它必须保留为外部文件(因此如果需要,它可以与多个应用程序/进程共享)并安装在 OS 加载程序可以找到的位置。这就是 DLL 的设计方式。再多的改变项目选项也不会改变这一点。

    如果您希望将库代码直接编译到应用程序中,则需要创建静态库而不是 DLL。

    【讨论】:

      【解决方案3】:

      不要添加您自己的 dll,请参阅here 如何创建您自己的静态库,您可以将其添加到您的项目中。如果只有 dll,就不可能生成静态库。您只能从 dll 生成导入库,为此您还需要分发 dll。

      【讨论】:

      • 嗯.. 我在我的帖子中写过我没有选中这些选项,所以据我所知静态链接是可以的。我对吗?但是..您回答的第二部分明确指出,即使通过库,我仍然必须包含 dll,因为我只有 dll。在这种情况下保持动态更简单。
      • 对不起,我的错误。我已经过度阅读了“未经检查”。我将删除答案的第一部分,因为它显然是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多