【问题标题】:How to use in c++ a dll created in visual studio without visual studio如何在 c++ 中使用在没有 Visual Studio 的 Visual Studio 中创建的 DLL
【发布时间】:2021-06-14 21:48:26
【问题描述】:

我已经用 Visual Studio 制作了一个 c++ dll,我成功地将它与 Visual Studio 一起使用,但我找不到如何仅使用 vscode 或更一般地仅使用命令行来使用它。我的目标是将我的库放在 github 上,并附上解释如何使用它的文档,但我无法在命令行中编译程序。
我尝试使用此命令:
g++ src/SummerFlow_Client.cpp -o bin/prog -I include -L lib -lmingw32 -lSummerFlow

包含“include”文件夹中包含代码的所有文件、“lib”文件夹中的 .lib 文件和“bin”文件夹中的我的 .dll 文件。
这返回了这个错误:

C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible lib/SummerFlow.lib when searching for -lSummerFlow
C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible lib/SummerFlow.lib when searching for -lSummerFlow
C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible lib\SummerFlow.lib when searching for -lSummerFlow
C:/Program Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lSummerFlow
collect2.exe: error: ld returned 1 exit status

【问题讨论】:

  • 你打算把二进制放在github上,还是放在源码上?
  • 请正确格式化您的帖子,因为它很难阅读。
  • 由于您使用的是 MingW,因此您也对它有依赖关系,因此您必须将 MingW 库也放入您的搜索路径中。如果这些也是 DLL,您也必须将它们捆绑在一起,因为您的 DLL 也需要它们,除非您静态链接所有内容。
  • 如果您正在谈论混合基于 c++ 的 msvc 和 mingw dll,您可能会遇到不兼容问题,从而阻止您使用使用其他工具链创建的 dll。标准库会有完全不同的实现
  • 如果您的编译器不同,为什么不能跨 DLL 边界共享标准库对象(如 std::string),请参阅 stackoverflow.com/a/5347413/103167。

标签: c++ dll g++


【解决方案1】:

简短的回答是,你不能。

您不能使用编译器 A 从编译器 B 生成的 C++ DLL,反之亦然,因为它们通常不使用相同的 ABI(应用程序二进制接口)。 为了使解释简短,其中一些元素可能不同(这不是一个详尽的列表):

  • 内存中对象的组织,即在哪里可以找到给定 this 指针的字段
  • 方法和 RTTI 的组织,即在哪里可以找到虚拟方法、有关类层次结构的信息等。
  • DLL 中导出的非虚拟方法、静态方法和全局函数的名称,称为名称修饰

每个编译器都有自己的策略来自行管理这些事情,多年来都做出了很多妥协。

C 有通用的 ABI 标准,所以很多时候,用 Visual Studio 编译的 DLL 也可以与 MinGW 一起使用,只要架构相同(当然你不能混合 32 位和 64 位,或英特尔和手臂)。

遗憾的是,这不适用于 C++。在 C++ 中,如果更改编译器,则必须重新编译 DLL。 请注意,ABI 也会不断发展,因此使用同一编译器的旧版本编译的 DLL 可能不适用于新版本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2011-06-27
  • 2010-11-02
  • 2012-07-26
相关资源
最近更新 更多