gcc 是否可以链接到使用 Visual C++ 创建的库?如果是这样,这样做是否会产生任何冲突/问题?
5 回答
这里的答案中的一些评论有点过于笼统。
虽然没有,但在特定情况下,提到的 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 试图以错误的调用类型调用导入的函数,就会发生不好的事情。
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.