混合C / C ++库
gcc是否可以链接到使用Visual C ++创建的库?如果是这样,这样做是否会引起任何冲突/问题?
解决方案
回答
我猜不会。通常,c ++编译器使用完全不同的名称处理方法,这意味着链接器将无法找到正确的符号。顺便说一句,这是一件好事,因为该标准允许C ++编译器具有更大的不兼容性级别,这不仅会导致程序崩溃,死机,吃掉小狗并在墙上涂抹油漆。
解决此问题的常用方案通常涉及与语言无关的技术,例如COM或者CORBA。一种更简单的方法是在C ++代码周围使用C"包装器"。
回答
这不可能。通常甚至不可能链接由同一编译器的不同版本产生的库。
回答
否。简单明了:-)
回答
答案中的某些评论有些过于笼统。
尽管没有,但在特定情况下,上述gcc二进制文件不会与VC ++库(AFAIK)链接。链接代码/库的实际方法是所使用的ABI标准的问题。
嵌入式领域中越来越普遍的标准是EABI(或者ARM ABI)标准(基于Itanium开发期间完成的工作http://www.codesourcery.com/cxx-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尝试使用错误的调用类型调用导入的函数,则会发生不良情况。
最重要的是保留一个符合ANSI C的简单接口,我们应该没事。疯狂的C ++继续存在的事实是可以的,只要它包含在内即可。
哦,请确保所有代码都是可重入的,否则我们冒着打开整个另一个can-o-worms的风险。