GCC和LLVM之间的兼容性

时间:2012-03-23 01:28:47

标签: gcc llvm abi

我正在开发一个跨平台的项目,在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,1648181840。两个编译器不应该是二进制兼容的吗?如果我使函数无效,那么它的工作正常。

1 个答案:

答案 0 :(得分:0)

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

struct retval func(int a)

......就这样:

void func(struct retval* retval, int a)

但是,小结构可以在寄存器中返回。 std::pair<int, int>只有8个字节,这意味着它在此上下文中计算得很小。

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

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