【问题标题】:How to use a dynamic library in c++ project using only the .dll file [duplicate]如何仅使用.dll文件在c ++项目中使用动态库[重复]
【发布时间】:2021-07-14 11:51:31
【问题描述】:

我已经在 c++ 中使用 cmake 生成了一个动态库。如何在没有库的 .h 或 .cpp 文件的情况下在另一个 c++ 项目中使用它。我只有 .dll 文件。

【问题讨论】:

  • 如果您只有 DLL,则必须对其进行逆向工程以重新构建一个 .h 文件。
  • 如果你想加载库动态,那么参见例如that question。如果您想以通常的方式使用该库(通过调用库中定义的函数并与之链接),那么您需要创建一个.lib 文件(export 文件)。为此,请参阅another question。在这两种情况下,要调用库的函数,您需要知道它的签名。而且通常无法从库中提取签名:see there.
  • 我有 .lib 文件,所以我该怎么做才能使用库中定义的函数。我是用 cmake 链接库还是直接使用它?

标签: c++ dll cmake header-files lib


【解决方案1】:

至少有两种方式:

  • 从您的 .dll 文件生成 .lib/.def(或其他文件)并将它们用于主机应用程序。您可以看到 implib、mkexp 等实用程序。
  • 使用 API:LoadLibrary 用于加载,GetProcAddress 用于获取函数指针。对此有 c++ 包装器:参见 boost::dll::import_alias。

【讨论】:

    【解决方案2】:

    正如您提到的dll,我假设您使用的是 Windows 平台。您可以使用dumpbin /exports someLib.dll 等工具列出dll 导出的函数,然后使用GetProcAddress 创建指向这些函数的函数指针。

    如果您需要更复杂的东西,例如使用 C++ 类型,这可能会变得更复杂甚至不可能,因为您需要链接到标准库的确切版本、编译器版本和编译器标志。

    例如,如果您在dll 中有一个函数void myFunction(const std::string&),您必须确保可执行文件中的std::string 与dll 中的二进制兼容。如果它们不是二进制兼容的,您将很难找到并解决运行时错误。即使您有标头,这也适用,这就是像 QT 这样的库提供多个版本的原因 same dll

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2022-08-02
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多