混合C / C ++库

时间:2008-09-04 04:56:39

标签: c++ visual-studio gcc linker

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

5 个答案:

答案 0 :(得分:3)

这里的答案中的一些评论略显过于笼统。

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

没有。简单明了: - )

答案 4 :(得分: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尝试使用错误的调用类型调用导入的函数,则会发生错误。

底线是保持一个符合ANSI C的简单界面,你应该没问题。疯狂的C ++落后的事实是可以的,只要它被包含。

哦,确保所有代码都是可重入的,否则你就有可能打开一个完整的can-o-worms。