【问题标题】:Mixing C/C++ Libraries混合 C/C++ 库
【发布时间】:2010-09-07 18:38:17
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-studio gcc linker


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          没有。简单明了:-)

          【讨论】:

            【解决方案5】:

            是的,如果你把它做成一个动态链接并把界面做成 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。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-06-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多