Dlaczego?
W zależności od źródła najprawdopodobniej kompilator Intela lub zdecydowanie kompilator generujący najszybsze pliki wykonywalne dla architektury x86 (skrócenie czasu wykonywania o 5 do 100%).
Intel oferuje swoje kompilatory dla Linuksa na niekomercyjnej licencji za darmo (myślę, że czytałem, że jest on darmowy gdzieś na ich stronie: Intel - niekomercyjne tworzenie oprogramowania ). Istnieje również bezpłatna niekomercyjna licencja dla studentów, ale ta licencja nie ma zastosowania, chociaż narzędzia są oferowane dla wszystkich trzech głównych systemów operacyjnych (link utracony z powodu ograniczenia reputacji).
Cel
Ja (jako student niebędący studentem) chciałbym móc korzystać z kompilatorów Intel w celu poprawy wydajności w ramach licencji niekomercyjnej do kompilacji plików obiektów, które można połączyć w celu utworzenia plików wykonywalnych i bibliotek linków dynamicznych dla systemu Windows (i ewentualnie systemu operacyjnego) X)
Więcej szczegółów:
Z tego dokumentu wywnioskowałem, że kompilatory Intela tworzą pliki obiektowe, które są kompatybilne z dominującymi kompilatorami platformy.
Pytania cząstkowe:
- Jakie są formaty plików obiektowych gcc, g ++, cl, mingw32, icc, icpc i icl w systemach Windows i Linux (aktualne wersje)?
- Czy do osiągnięcia celu można wykorzystać części zestawu narzędzi kompilatora krzyżowego mingw32?
- Czy mam rację, że metadane w wygenerowanych plikach obiektowych są głównym problemem?
ad 2:
mingw32-objcopy wydaje się być w stanie przekonwertować dane wyjściowe kompilatora Intela w Linuksie (prawdopodobnie ELF) na COFF kompatybilny z Microsoftem (z możliwym wyjątkiem plików obiektów relokowalnych). Czy ktoś mógłby potwierdzić, że to rzeczywiście działa (w przypadku aplikacji nietypowych), proszę?
Odpowiedzi:
Możliwe jest tworzenie plików wykonywalnych systemu Windows na komputerze z systemem Linux przy użyciu kompilatora krzyżowego. Ale Intel nie zapewnia takich kompilatorów krzyżowych.
Aby odpowiedzieć na pytania częściowe:
Format plików obiektowych jest skutecznie określany przez system operacyjny (a raczej kompilator użyty do jego zbudowania). W systemie Windows jest to format Portable Executable (PE) , a w systemie Linux format ELF .
Nie. Odpowiednią częścią jest generator kodu, który jest zarówno częścią odpowiedzialną za generowanie odpowiedniego formatu obiektu, jak i częścią kompilatorów Intela, która nadaje wygenerowanemu kodowi przewagę prędkości.
Nie. To jedna kwestia, ale jest ich więcej. Bardziej podstawowym problemem jest potencjalna różnica w przekazywaniu parametrów do jądra i / lub biblioteki standardowej. IIRC, te konwencje są różne w systemach Windows i Linux.
źródło
Odpowiedź jest prawie na pewno tak. Wiem, że kompilowanie plików binarnych systemu Windows (za pomocą mingw32 ) na Linux-ie jest łatwo możliwe przy użyciu gcc - oczywiście nie będziesz mógł uruchomić programu na Linuxie (chyba że działa pod Wine), ale znam kilka programów, które dostają Pliki binarne systemu Windows w ten sposób.
Jednak nie wiem, czy kompilator Intel ma takie możliwości, powinienem tak myśleć.
Format obiektowy dla systemu Windows to PE , a dla systemu Linux jego ELF .
źródło
Dzięki kodowi C łączącemu się z niczym (bezpośrednio), który wykorzystuje niestandardowe konwencje wywoływania Microsoft, możesz mieć szansę korzystania z MinGW
objcopy
. Użyłem go do konwersji złożonego pliku obiektowego, ale potem nie musiałem się martwić o konwencje wywoływania.Po prostu spędziłbym czas, który próbowałbyś zrobić, zamiast tego, aby uzyskać GCC lub błahostkę, aby robić dokładnie to, co chcesz. Jeśli takie przyspieszenie jest naprawdę tak ważne, skompiluj plik binarny systemu Linux za pomocą kompilatora Intel i spróbuj dokładnie zobaczyć, co w ogóle przyspiesza twój kod. Możesz załatać zespół, jeśli wszystko inne zawiedzie.
źródło
Proponuję następującą odpowiedź:
Zdecydowanie może (skłaniając się ku tak) z pewnym kontekstem.
Objaśnienie: Jeśli chodzi o część „pochyloną”: wydaje się, że nie jest to strata czasu na wypróbowanie tego, ale (część „wstawiająca”), biorąc pod uwagę tę odpowiedź , prawdopodobnie nie dostaniesz poprawy czasu wykonania w porównaniu z Intelem -tylko łańcuch narzędzi. Istotną częścią jest linker i sprzężenie zwrotne środowiska wykonawczego z kompilatorem (optymalizacja całego programu, optymalizacja kierowana profilem, generowanie kodu czasu łącza).
Informacje dodatkowe:
Zgodnie z często zadawanymi pytaniami MinGW możliwe są problemy z używaniem bibliotek i bibliotek DLL:
„Chociaż biblioteki DLL powinny być dość przenośne w różnych kompilatorach Windows, dostęp do bibliotek DLL przez plik biblioteki (.lib lub .a) nie jest. Biblioteka formaty plików są specyficzne dla poszczególnych kompilatorów i nie można ich używać przenośnie z różnymi kompilatorami, chyba że kompilator zapewnia taką obsługę ”.
Aby wypełnić odpowiedź:
pytanie 1:
Domyślnym formatem plików obiektowych dla dowolnego kompilatora w systemie Windows jest COFF (prawdopodobnie wariant PE ). Domyślnym formatem plików obiektowych dla dowolnego kompilatora w systemie Linux jest ELF
podpytanie 2:
Najprawdopodobniej tak (w części łączącej), ale najprawdopodobniej nie uzyskasz znacznej poprawy czasu wykonania.
podpytanie 3:
Odnośnie linkowania: tak.
źródło