2012-03-23 5 views
2

크로스 플랫폼 인 프로젝트에서 작업 중이며 OS X에서는 한 섹션이 clang/llvm으로 작성되어야합니다. 왜냐하면 코코아 창을 만들기 때문에 나머지 프로젝트는 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; 
} 

나는 makefile을 생성하기 위해 CMake를 사용하고 있습니다. 난 여러 가지 컴파일러 플래그 -fPIC 등의 다른 세트를 시도했지만 1835455280, 1746993968, 1648001840처럼 인쇄 값을 얻을. 두 컴파일러는 이진 호환해야하지 않아야합니까? 함수를 void로 만들면 잘 동작합니다.

+0

저는 LLVM에 대해서는 몰라요.하지만 C++의 경우에도 다른 주요 버전의 GCC가 항상 바이너리 호환되는 것은 아닙니다. 나는 문제가 생기기 위해 잠시 돌아야한다고 생각한다. – ams

+1

의 사운드는 버그를 좋아합니다. LLVM의 bugzilla에 문제 보고서를 제출하십시오. –

답변

0

다른 컴파일러는 값별로 구조를 반환하기 위해 다른 전략을 사용합니다.

struct retval func(int a) 

를이로 ... : 내부적으로 재 작성에 한 가지 일반적인 기술이다

그러나
void func(struct retval* retval, int a) 

는, 작은 구조는 레지스터에 반환 할 수 있습니다. std::pair<int, int>은 8 바이트 뿐이므로이 컨텍스트에서 작은 것으로 간주됩니다.

필자는 한 컴파일러가 첫 번째 컴파일러를 수행하고 두 번째 컴파일러가 후자를 수행하고 있다고 의심합니다. 일치하지 않는다는 의미입니다.

잘못 되었나요? 던노. 나는 clang의 libstdC++가 이 아니라이 아닌 gcc의 이진 상호 운용 가능하다는 것을 알고있다. 하지만 사용자 환경에서는 두 컴파일러가 모두 동일한 라이브러리를보고있을 것입니다 (이를 확인해야 할 수도 있습니다). 내 이해는 컴파일러 사이의 C++ 바이너리 호환성은 일반적으로 현실 세계에서는 가능하지 않다고 생각합니다. 그러나 이론적으로 가능할 수도 있습니다.