Совместимость между GCC и LLVM - PullRequest
2 голосов
/ 23 марта 2012

Я работаю над проектом, который является кроссплатформенным, и в OS X один раздел должен быть построен с помощью clang / llvm, потому что он создает окно Какао, остальная часть проекта создается с помощью 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 для генерации make-файла.Я пробовал несколько различных наборов флагов компилятора -fPIC и т. Д. Но я печатаю значения, например 1835455280, 1746993968, 1648001840. Разве два компилятора не должны быть двоично-совместимыми?Если я сделаю функцию недействительной, то она будет работать нормально.

1 Ответ

0 голосов
/ 17 января 2013

Различные компиляторы используют разные стратегии для возврата структур по значению.Одним из распространенных методов является внутреннее переписывание этого:

struct retval func(int a)

... как это:

void func(struct retval* retval, int a)

Однако небольшие структуры могут быть возвращены в регистрах.Значение std::pair<int, int> составляет всего 8 байтов, что означает, что в данном контексте он считается малым.

Я подозреваю, что один компилятор выполняет первый, а второй - последний.Что означает, что они не совпадают.

Это неправильно?Не знаю.Я знаю, что libstdc ++ от clang не двоично совместим с gcc.Но в вашей среде оба компилятора, вероятно, видят одну и ту же библиотеку (вы можете проверить это).Насколько я понимаю, двоичная совместимость C ++ между компиляторами, как правило, считается невозможной в реальном мире.Но это может быть теоретически возможно.

...