混合C/C++;图书馆 < GCC是否可以链接到用VisualC++生成的库?如果是,是否存在任何可能由此产生的冲突/问题

混合C/C++;图书馆 < GCC是否可以链接到用VisualC++生成的库?如果是,是否存在任何可能由此产生的冲突/问题,c++,visual-studio,gcc,linker,C++,Visual Studio,Gcc,Linker,我想不会。通常C++编译器有不同的名字处理方法,这意味着链接器将无法找到正确的符号。顺便说一下,这是一件好事,因为标准允许C++编译器有更大程度的不兼容性,这将导致程序崩溃、死亡、吃小狗和涂抹墙壁。 解决这一问题的常用方案通常涉及与语言无关的技术,如COM或CORBA。一种更简单的神圣化方法是在C++代码周围使用C“包装器”。 < P>这是不可能的。通常甚至不可能链接由同一编译器的不同版本生成的库。否。简单明了:-)此处答案中的一些注释有点过于笼统 虽然没有,但在提到的特定情况下,gcc二进制文

我想不会。通常C++编译器有不同的名字处理方法,这意味着链接器将无法找到正确的符号。顺便说一下,这是一件好事,因为标准允许C++编译器有更大程度的不兼容性,这将导致程序崩溃、死亡、吃小狗和涂抹墙壁。
解决这一问题的常用方案通常涉及与语言无关的技术,如COM或CORBA。一种更简单的神圣化方法是在C++代码周围使用C“包装器”。

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

否。简单明了:-)

此处答案中的一些注释有点过于笼统

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

嵌入式世界中越来越普遍的标准是EABI(或ARM ABI)标准(基于安腾开发期间完成的工作)。如果编译器符合EABI标准,那么它们可以生成相互兼容的可执行文件和库。多个工具链协同工作的一个例子是ARM的RVCT编译器,它生成的二进制文件将与GCC ARM ABI二进制文件一起工作


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

是的,如果您将其设置为动态链接并将界面设置为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试图用错误的调用类型调用导入的函数,则会发生不好的事情
底线是保持一个符合ANSIC标准的简单接口,您应该很好。疯狂C++的后面是事实,只要它被包含。

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