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?
Odpowiedz
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.
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
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.
Pytanie jest oznaczone jako C, więc można oczekiwać, że cały ABI będzie taki sam. –
Masz rację, źle odczytałem pytanie Jednak część o tym błędzie stoi. – Marvin
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.
- 1. Nie mogę skompilować C++ z gcc
- 2. Jak skompilować C++ z Clang?
- 3. Przepisz makro GCC z zagnieżdżoną funkcją Clang?
- 4. Czy mogę użyć składni Intel zestawu x86 z GCC?
- 5. Jak mogę skompilować program Go?
- 6. Jak skompilować GCC bez _alloca?
- 7. Czy mogę wziąć pierwsze n elementów z wyliczenia, a następnie użyć reszty wyliczenia?
- 8. gcc i clang nie zgadzają się na funkcję constexpr
- 9. GCC vs brzękiem: inline funkcję z -fPIC
- 10. Czy P/Invoke wykonuje DLL, a następnie go wyłącza?
- 11. Czy mogę skompilować uniwersalny kod za pomocą GCC Macports?
- 12. Czy mogę użyć wielu "z"?
- 13. Korzystanie z wbudowaną funkcję __builtin_add_overflow_p w gcc
- 14. Clang i GCC akceptują wątpliwe sizeof
- 15. Jak mogę sprawdzić, czy stan reactjs został zaktualizowany, a następnie wywołać funkcję?
- 16. Używanie wanilii GCC (lub Clang) z Androidem NDK
- 17. Jak mogę uruchomić GCC/Clang do analizy statycznej? (tylko ostrzeżenia)
- 18. Czy Clang ma odpowiednik flagi -malign-double GCC?
- 19. Czy mogę zapisać dane wejściowe z formularza na .txt w HTML, używając JAVASCRIPT/jQuery, a następnie użyć?
- 20. Czy mogę zawiesić, a następnie wznowić kontener Docker?
- 21. Czy mogę wpisać introspekcję obiektami cech, a następnie ją spuścić?
- 22. Dlaczego clang wybiera instalację gcc?
- 23. Czy mogę powiązać funkcję, która przyjmuje domyślne argumenty, a następnie wywołuje ją?
- 24. można zainstalować pakiet ironruby nuget, a następnie użyć go w wanilii VS2012
- 25. Czy istnieje sposób, aby usunąć etykietę lub przycisk z okna tkinter, a następnie dodać go ponownie?
- 26. Wykryj gcc w przeciwieństwie do msvc/clang z makro
- 27. Jak działa uint24_t clang? Czy mogę go używać poza CLL/LLVM?
- 28. Jak ustawić Clang, aby użyć MinGW libstdC++
- 29. Jak mogę skompilować rozwiązanie C# z Roslyn?
- 30. Czy mogę zarchiwizować za pomocą certyfikatu programisty, a następnie ponownie go podpisać podczas przesyłania z certyfikatem dystrybucji?
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++"). –
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 –
@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). –