6

gcc 是否可以链接到使用 Visual C++ 创建的库?如果是这样,这样做是否会产生任何冲突/问题?

4

5 回答 5

4

这里的答案中的一些评论有点过于笼统。

虽然没有,但在特定情况下,提到的 gcc 二进制文件不会与 VC++ 库(AFAIK)链接。链接代码/库的实际方法是所使用的 ABI 标准的问题。

嵌入式世界中越来越普遍的标准是 EABI(或 ARM ABI)标准(基于在 Itanium 开发期间完成的工作http://www.codesourcery.com/cxx-abi/)。如果编译器符合 EABI,它们可以生成可执行文件和库,它们可以相互协作。多个工具链一起工作的一个例子是 ARM 的 RVCT 编译器,它生成的二进制文件可以与 GCC ARM ABI 二进制文件一起使用。

(代码源链接目前已关闭,但可以谷歌缓存)

于 2008-09-04T07:46:12.703 回答
1

我猜不会。通常 c++ 编译器具有完全不同的名称修饰方法,这意味着链接器将无法找到正确的符号。顺便说一句,这是一件好事,因为标准允许 C++ 编译器具有更高级别的不兼容性,而不仅仅是这会导致您的程序崩溃、死亡、吃小狗和把油漆弄得满地都是。

解决此问题的常用方案通常涉及独立于语言的技术,如 COM 或 CORBA。一个更简单的神圣方法是在 C++ 代码周围使用 C“包装器”。

于 2008-09-04T05:02:04.953 回答
1

这不可能。通常甚至不可能链接由同一编译器的不同版本生成的库。

于 2008-09-04T06:22:44.167 回答
1

不。简单明了:-)

于 2008-09-04T06:25:37.887 回答
1

是的,如果您将其设为动态链接并制作界面 c 样式。lib.exe 将生成与 gcc 工具链兼容的导入库。

这将解决您的链接问题。然而,这只是问题的开始。

您更大的问题将是异常和内存分配等问题。

  • 您必须确保从 VC++ 到 gcc 代码没有异常交叉,不保证兼容性。
  • VC++ 库中的每个对象都需要存在于堆上,因为:
  • 不要将 gcc new/delete 与 VC++ 中的任何内容混合使用,否则会发生不好的事情。这也适用于堆栈上的对象构造。然而,如果你创建一个像 create_some_obj()/delete_some_obj() 这样的接口,你最终不会使用 gcc new 来构造 VC++ 对象。也许制作一个处理构造和破坏的小处理程序对象。这样您可以保留 RAII,但仍将 c 接口用于真正的接口。
  • 调用约定必须正确。在 VC++ 中有 cdecl 和 stdcall。如果 gcc 试图以错误的调用类型调用导入的函数,就会发生不好的事情。

The bottom line is keep a simple interface that is ANSI C compliant, and you should be fine. The fact that crazy C++ goes on behind is okay, as long as it is contained.

Oh and make sure all the code is re-entrant, or you risk opening a whole nother can-o-worms.

于 2008-09-05T06:48:30.103 回答