在Visual Studio 2010 C++项目中使用MinGW构建的dll

3

我已经建立了一个dll,现在我想在Microsoft Visual Studio项目中使用这个dll。

g++ -O0 -Wall -c -fmessage-length=0 -osrc\MyLib.o ..\src\MyLib.cpp
g++ -shared -Wl,--out-implib=MyLib.lib -Wl,--output-def=MyLib.def -oMyLib.dll src\MyLib.o -lwsock32

当我在“gcc项目”中使用它时,dll可以正常工作。

我尝试了不同的方法来创建“.lib”和“.def”文件,并尝试按照不同的教程导入这些库到VS中。但是VS找不到在dll中声明的方法...

非常感谢您的任何帮助。

3个回答

3

你听说过名称修饰吗?除非从DLL导出的函数标记为extern "C",否则它们的名称将以编译器特定的方式进行修改。因此就会出现问题。


2
更糟糕的是,这不仅仅涉及名称混淆,还包括异常处理或对象内存布局等其他内容也不兼容。而且这不仅限于不同的编译器,同一编译器的不同版本或使用不同选项的编译器调用也可能彼此不兼容。 - Rudi
1
@Rudi:+1。更不用说标准库的不同实现了。 - Nemanja Trifunovic

1
为了让其他人受益,请查看二进制兼容的C++接口。 从上面可以清楚地看出,没有直接的方式可以将使用MinGW构建的C++ DLL与MS Visual Studio进行接口连接。这种接口只能通过基于C的接口“干净”地工作。

链接已失效,请更换。 - Rainb

1

如果您希望您的dll可以与其他编译器一起使用,您有以下选项:

  1. 仅公开“C”接口(使用extern "C")- 没有类或任何特定于C ++的内容。
  2. 创建COM dll。
  3. 创建符合相同约束条件的自己的类似COM模型。

我认为纯抽象类也是独立于编译器的(至少在某种程度上是这样的)。 - Pedro d'Aquino
@Pedro:这就是我所说的选项3),尽管它比仅使用抽象类要复杂一些。 - Nemanja Trifunovic
GCC和MSVC均可用于创建COM dlls——这是一种基于符合虚函数实现的二进制接口。如果参数类型为POD或纯虚类,应该可以安全地在MSVC和GCC之间传递纯虚类。 - Chris Becke
我该如何使用gcc创建一个COM dll(二进制接口/ABI)dll?我认为我使用了错误的关键字,因为我在这个主题上找不到任何东西。 - Sascha
2
@Sascha:从这里开始看看它是如何工作的(虽然示例使用纯C语言,但很容易将其转换为C ++)http://www.codeproject.com/KB/COM/com_in_c1.aspx - Nemanja Trifunovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接