2012-03-23 144 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++二進制兼容性通常被認爲在現實世界中是不可能的。但這在理論上可能是可能的。

相關問題