我正在开发一个跨平台的项目,在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。两个编译器不应该是二进制兼容的吗?如果我使函数无效,那么它的工作正常。
答案 0 :(得分:0)
不同的编译器使用不同的策略按值返回结构。一种常见的技术是在内部重写:
struct retval func(int a)
......就这样:
void func(struct retval* retval, int a)
但是,小结构可以在寄存器中返回。 std::pair<int, int>
只有8个字节,这意味着它在此上下文中计算得很小。
我怀疑发生的事情是,一个编译器正在执行第一个,第二个编译器正在执行后者。这意味着它们不匹配。
这是错的吗?不知道。我知道clang的libstdc ++与不是二进制文件可与gcc互操作。但在您的环境中,两个编译器可能都看到了相同的库(您可能需要验证这一点)。我的理解是,编译器之间的C ++二进制兼容性通常被认为在现实世界中是不可能的。但它在理论上可能是可能的。