【问题标题】:Compatibility between GCC and LLVMGCC 和 LLVM 之间的兼容性
【发布时间】:2012-03-23 01:28:46
【问题描述】:

我正在开发一个跨平台的项目,在 OS X 上,必须使用 clang/llvm 构建一个部分,因为它会创建一个 Cocoa 窗口,该项目的其余部分是使用 GCC 构建的。这被编译成一个静态库,该库链接到主可执行文件。例如

//printnum.h
std::pair<uint32_t, uint32_t> printnum(int num);

//printnum.mm
#include "printnum.h"
#include <stdio.h>

std::pair<uint32_t, uint32_t> printnum(int num)
{
    printf("%d\n", num);
    //..... Objective C Code.....
}

//main.cpp
#include "printnum.h"

int main()
{
    printnum(0);
    return 0;
}

我正在使用 CMake 生成一个 makefile。我已经尝试了几组不同的编译器标志-fPIC 等。但我得到的值打印为 1835455280、1746993968、1648001840。这两个编译器不应该是二进制兼容的吗?如果我使函数无效,那么它就可以正常工作。

【问题讨论】:

  • 我不了解 LLVM,但对于 C++,即使是不同的主要版本的 GCC 也不总是二进制兼容的。我认为您必须退后一段时间才能遇到问题。
  • 听起来像是一个错误。请在 LLVM 的 bugzilla 中提交问题报告。

标签: gcc llvm abi


【解决方案1】:

不同的编译器使用不同的策略来按值返回结构。一种常见的技术是内部重写:

struct retval func(int a)

...就像这样:

void func(struct retval* retval, int a)

但是,可以在寄存器中返回小结构。 std::pair&lt;int, int&gt; 只有 8 个字节,这意味着它在这种情况下算小。

我怀疑发生的事情是一个编译器在做第一个,而第二个在做后者。这意味着它们不匹配。

这是错的吗?不知道。我知道 clang 的 libstdc++ 是 not 与 gcc 的二进制互操作的。但是在您的环境中,两个编译器可能都看到相同的库(您可能想要验证这一点)。我的理解是,编译器之间的 C++ 二进制兼容性通常被认为在现实世界中是不可能的。不过理论上是可以的。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2017-03-27
    • 2019-12-27
    • 2021-12-27
    相关资源
    最近更新 更多