2013-05-03 9 views
7

Próbuję użyć intrinsics SSE4.2 z clang/llvm, ale jej nie kompilacji, ponieważ dostaję cannot select intrinsic błąd z LLVM. Z drugiej strony ten sam kod kompiluje się bezbłędnie w gcc. Pomyślałem więc, że mogę skompilować tę funkcję z gcc, aby mieć obiekt lub plik biblioteki, a następnie wywołać tę funkcję biblioteki w moim kodzie, który jest kompilowany przez clang/llvm. Czy to działa?Czy mogę skompilować funkcję z gcc, a następnie użyć go z clang?

+3

Prawdopodobnie. To zależy od twojego systemu. Prochowiec? Linux? Windows? Ogólnie można mieszać pliki obiektów zbudowane z clang i gcc. Upewnij się, że używasz tej samej standardowej biblioteki (nie mieszaj "libC++" i "libstdC++"). –

+5

Dla zwykłego C, jest prawie pewne; wszystkie kompilatory używają tam wspólnego _ABI_ (_Plik binarny aplikacji), tj. te same mechanizmy dla wykonawczych funkcji przesyłania/wywoływania, przekazywania i zwracania parametrów, układania struktur danych/dopasowywania zmiennych). W przypadku języka C++ nie jest to generalnie prawdą (nie można na przykład wywołać kodu Microsoft Visual C++ z gcc/MinGW i na odwrót), ale w przypadku gcc/clang masz szczęście - używają tego samego C i C++ ABI, a zatem kod binarny jest zgodny: http://stackoverflow.com/questions/11682748/is-clang-abi-same-as-g –

+1

@FrankH., Możesz zadzwonić do kodu GCC z MSVC (zobacz moją odpowiedź). W rzeczywistości możesz zadzwonić do MSVC z GCC (choć nie wiem, dlaczego chciałbyś, ponieważ GCC jest zawsze lepsza w optymalizacji), ale jest to trudniejsze, ponieważ MSVC nie zapewnia sposobu na tworzenie konwencji wywoływania funkcji Uniksa, więc musisz Zrób to po utworzeniu obiektu i jest bardziej restrykcyjne (np. tylko dla funkcji z czterema parametrami). –

Odpowiedz

0

Dla każdego bardziej lub mniej skomplikowanego kodu C++, np. Takiego, który kompiluje się do vtable - odpowiedź brzmi NIE. Te dwa NIE są kompatybilne.

Aby zilustrować powyższy punkt, spróbuj skompilować bibliotekę Crypto++ za pomocą g ++ (zyskuje około 40% przyspieszenia dla AES/GCM), a następnie połączyć swój kod ++ skompilowany z tym kodem.

+3

Korygowanie własne odpowiedzi: tak możesz. Skompiluj swój kod za pomocą "clang ++ -stdlib = libstdC++". Następnie połączy poprawnie bibliotekę skompilowaną z g ++ (w tym Crypto ++). Niestety, rewers nie działa: g ++ - skompilowany kod nie zadziała z clang ++ - skompilowana biblioteka, bez względu na to jakie flagi próbowałem. :-( – Mouse

0

Może, ale nie musi działać. Niektóre elementy ABI mogą być takie same. Na przykład, wierzę, że zarówno g ++, jak i clang używają schematu wymazywania nazw Itanium ABI. Inne elementy nie mogą. To zależy od tego, jak skomplikowany jest kod, który kompilujesz.

Sugeruję również otwarcie LLVM bug dla właściwości wewnętrznych, które nie mogą zostać wybrane. Clang i LLVM mają bardzo aktywną społeczność i możliwe, że ktoś szybko wybierze błąd.

+1

Pytanie jest oznaczone jako C, więc można oczekiwać, że cały ABI będzie taki sam. –

+0

Masz rację, źle odczytałem pytanie Jednak część o tym błędzie stoi. – Marvin

4

Możliwe jest skompilowanie pliku obiektowego z GCC w systemie Linux i przekonwertowanie go do pracy w Visual Studio. Zrobiłem to ostatnio z systemem Linux w Virtual Box na Windows converting-c-object-file-from-linux-o-to-windows-obj, więc powinno być to możliwe z Clang na Linux lub Windows.

Tak więc można to zrobić nie tylko w kompilatorze krzyżowym, ale można to zrobić na platformie krzyżowej.

Potrzebne są poprawne konwencje wywoływania i format pliku obiektowego (w przypadku C++ także mangling). Z GCC podczas kompilacji można powiedzieć, która konwencja wywołująca/API do użytku z mabi. Następnie, przechodząc z Linuxa na Windows, potrzebujesz konwertera plików obiektowych do konwersji z np. ELF na Linuxie do COFF w systemie Windows. Oczywiście zdarzają się przypadki, że prawdopodobnie to nie zadziała (np. Jeśli moduł polega na wywołaniu systemowym, które jest tylko na jednej platformie). Zobacz powyższy link, aby uzyskać więcej informacji.

Powiązane problemy