2012-03-23 113 views
2

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

//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.两个编译器不应该是二进制兼容的吗?如果我使这个函数无效,那么它工作得很好。

+0

我不知道LLVM,但对于C++甚至不同的主要版本的GCC并不总是二进制兼容的。我认为你必须回头一段时间才能有问题。 – ams 2012-03-23 17:30:24

+1

声音喜欢一个错误。请在LLVM的bugzilla中提交问题报告。 – 2012-03-24 17:54:18

回答

0

不同的编译器使用不同的策略按值返回结构。一个常用的方法是在内部改写这个:

struct retval func(int a) 

...就象这样:

void func(struct retval* retval, int a) 

然而,小的结构可以在寄存器中返回。 A std::pair<int, int>只有8个字节,这意味着在这种情况下它计数很小。

我怀疑发生了什么是一个编译器正在做第一个,第二个正在做后者。这意味着他们不匹配。

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

相关问题