2012-03-23 6 views
2

私はクロスプラットフォームのプロジェクトに取り組んでいます。OS Xでは、CCCAウィンドウを作成するので、clang/llvmで1つのセクションを構築しなければならず、プロジェクトの残りは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を使用してメイクファイルを生成しています。コンパイラフラグ-fPICなどのいくつかの異なるセットを試しましたが、1835455280、1746993968、1648001840のように値が表示されます.2つのコンパイラはバイナリ互換でなければなりませんか?関数をvoidにするとうまくいきます。

+0

私はLLVMについてはわかりませんが、C++では、GCCの異なるメジャーバージョンであっても、必ずしもバイナリ互換であるとは限りません。私はあなたが問題を抱えるためにしばらく前に戻らなければならないと思います。 – ams

+1

Soundsはバグが好きです。 LLVMのbugzillaで問題報告を提出してください。 –

答えて

0

異なるコンパイラは、値によって構造体を返すための異なる戦略を使用します。

void func(struct retval* retval, int a) 

は、しかし、小さな構造は、レジスタに返すことができます。このよう...

struct retval func(int a) 

:1つの一般的な技術は、内部でこれを書き換えることです。 std::pair<int, int>はわずか8バイトです。つまり、このコンテキストでは小さいとみなされます。

私が起こっていると思われることは、1つのコンパイラが最初に行い、2番目が後者です。つまり、彼らは一致していないことを意味します。

これは間違っていますか?ダニー。私はclangのlibstdC++がではなく、ではなく、gccのバイナリと相互運用可能であることを知っています。しかし、あなたの環境では、両方のコンパイラがおそらく同じライブラリを見ているでしょう(これを確認したいかもしれません)。私の理解は、コンパイラ間のC++バイナリ互換性は一般的には現実世界では可能ではないと考えられていることです。しかし理論的には可能かもしれない。

関連する問題