2

私はクロスプラットフォームのプロジェクトに取り組んでおり、OS X では Cocoa ウィンドウを作成するため、clang/llvm で 1 つのセクションをビルドする必要があり、プロジェクトの残りの部分は 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、1648001840 のように出力されます。2 つのコンパイラはバイナリ互換ではないのでしょうか? 関数を無効にすると、問題なく動作します。

4

1 に答える 1

0

異なるコンパイラは、値によって構造体を返すために異なる戦略を使用します。一般的な手法の 1 つは、これを内部的に書き換えることです。

struct retval func(int a)

...このように:

void func(struct retval* retval, int a)

ただし、小さな構造体はレジスターで返すことができます。Astd::pair<int, int>はわずか 8 バイトです。つまり、このコンテキストでは小さいと見なされます。

私が考えているのは、1 つのコンパイラが最初の処理を行い、2 番目のコンパイラが後者の処理を行っているということです。つまり、一致していません。

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

于 2013-01-17T17:37:35.673 に答える