2

我正在开发一个跨平台的项目,在 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 生成生成文件。我尝试了几组不同的编译器标志-fPIC等。但我得到的值打印为 1835455280、1746993968、1648001840。这两个编译器不应该是二进制兼容的吗?如果我使函数无效,那么它就可以正常工作。

4

1 回答 1

0

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

struct retval func(int a)

...这样:

void func(struct retval* retval, int a)

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

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

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

于 2013-01-17T17:37:35.673 回答