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

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

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

不。干净利落 :-)

是的,如果你将其设为动态链接并将界面设为 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 尝试使用错误的调用类型调用导入的函数,就会发生不好的事情。

最重要的是保持一个符合 ANSI C 标准的简单接口,这样就可以了。事实上,疯狂的 C++ 仍在继续,只要它被包含在内,就没关系。

哦,还要确保所有代码都是可重入的,否则您可能会面临打开另一个can-o-worms的风险。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top