如何在 c++ 中使用在 visual studio 中创建的 dll 而无需 visual studio
How to use in c++ a dll created in visual studio without visual studio
我用 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”中,我的 .dll 文件在文件夹“bin”中。
这返回了这个错误:
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
简而言之,你不能。
您不能使用编译器 A 从编译器 B 生成的 C++ DLL,反之亦然,因为它们通常不使用相同的 ABI(应用程序二进制接口)。
为了使解释简短,其中一些元素可能有所不同(这不是一个详尽的列表):
- 对象在内存中的组织,即在给定 this 指针的情况下在哪里找到哪个字段
- 方法和 RTTI 的组织,即在哪里可以找到虚拟方法、有关 class 层次结构的信息等
- DLL 中导出的非虚拟方法、静态方法和全局函数的名称,称为名称修改
每个编译器都有自己的策略来自行管理这些东西,这些年来都经过了很多妥协。
C 存在通用的 ABI 标准,所以通常情况下,用 Visual Studio 编译的 DLL 也可以与 MinGW 一起使用,只要体系结构相同(当然你不能混用32 位和 64 位,或 Intel 和 arm)。
遗憾的是,C++ 并非如此。在 C++ 中,如果更改编译器,则必须重新编译 DLL。
请注意,ABI 也在进化,因此使用同一编译器的旧版本编译的 DLL 可能无法在新版本中使用。
我用 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”中,我的 .dll 文件在文件夹“bin”中。
这返回了这个错误:
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
简而言之,你不能。
您不能使用编译器 A 从编译器 B 生成的 C++ DLL,反之亦然,因为它们通常不使用相同的 ABI(应用程序二进制接口)。 为了使解释简短,其中一些元素可能有所不同(这不是一个详尽的列表):
- 对象在内存中的组织,即在给定 this 指针的情况下在哪里找到哪个字段
- 方法和 RTTI 的组织,即在哪里可以找到虚拟方法、有关 class 层次结构的信息等
- DLL 中导出的非虚拟方法、静态方法和全局函数的名称,称为名称修改
每个编译器都有自己的策略来自行管理这些东西,这些年来都经过了很多妥协。
C 存在通用的 ABI 标准,所以通常情况下,用 Visual Studio 编译的 DLL 也可以与 MinGW 一起使用,只要体系结构相同(当然你不能混用32 位和 64 位,或 Intel 和 arm)。
遗憾的是,C++ 并非如此。在 C++ 中,如果更改编译器,则必须重新编译 DLL。 请注意,ABI 也在进化,因此使用同一编译器的旧版本编译的 DLL 可能无法在新版本中使用。