Czy można używać kompilatora Intel C / C ++ w systemie Linux do tworzenia plików obiektowych do połączenia w systemie Windows?

12

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:

  1. Jakie są formaty plików obiektowych gcc, g ++, cl, mingw32, icc, icpc i icl w systemach Windows i Linux (aktualne wersje)?
  2. Czy do osiągnięcia celu można wykorzystać części zestawu narzędzi kompilatora krzyżowego mingw32?
  3. 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ę?

Hugo
źródło
1
+1. Interesujące pytanie.
Neil
Czy zajrzałeś do Wine? AFAIK, Wine zapewnia zestaw narzędzi, który może budować pliki wykonywalne systemu Windows w systemie Linux; całkiem możliwe, że mógłbyś z tym skorzystać. Możesz również odnieść sukces, uruchamiając Windows ICC wewnątrz Wine i podłączając to za pomocą łańcucha narzędzi do kompilacji ming32. Nie próbowałem tego, ale przy wystarczającej ilości majstrowania myślę, że powinno to być możliwe.
tdammers
@tdammers Według WineHQ zestawem narzędzi do budowy plików wykonywalnych systemu Windows w systemie Linux jest mingw32, jeśli się nie mylę.
Hugo
Na forach Intela odpowiedź wydaje się „nie”: software.intel.com/en-us/forums/topic/282588
Vitor Py
@VitorBraga Zinterpretowałem pytanie w ten sposób: „Czy kompilator Intel może bezpośrednio kompilować krzyżowo?” Odpowiedź brzmi „nie” (o ile mi wiadomo, brakuje wymaganych opcji i bibliotek), ale ... architektura komputera (IA32, AMD64) byłaby taka sama w moim przypadku i jeśli używam tylko bibliotek systemu Windows aby skompilować program w systemie Linux, spodziewałbym się kodu wykonywalnego, który mógłby zostać wykonany w systemie Windows - jeśli jest połączony z bibliotekami Windows w celu utworzenia pliku wykonywalnego Windows.
Hugo

Odpowiedzi:

1

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:

Jakie są formaty plików obiektowych gcc, g ++, cl, mingw32, icc, icpc i icl w systemach Windows i Linux (aktualne wersje)?

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 .

Czy do osiągnięcia celu można wykorzystać części zestawu narzędzi kompilatora krzyżowego mingw32?

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.

Czy mam rację, że metadane w wygenerowanych plikach obiektowych są głównym problemem?

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.

Bart van Ingen Schenau
źródło
0

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 .

gbjbaanb
źródło
Według msdn : „Kompilatory produkują pliki obiektowe (.obj) typu Common Object File Format (COFF).” <br/>
Hugo
OK, to nie zadziałało. Według Wikipedii PE pochodzi z COFF i oba formaty plików mogą być używane jako format plików obiektowych i format plików wykonywalnych.
Hugo
0

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.

Ericson2314
źródło
0

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:

Jakie są formaty plików obiektowych gcc, g ++, cl, mingw32, icc, icpc i icl w systemach Windows i Linux (aktualne wersje)?

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:

Czy do osiągnięcia celu można wykorzystać części zestawu narzędzi kompilatora krzyżowego mingw32?

Najprawdopodobniej tak (w części łączącej), ale najprawdopodobniej nie uzyskasz znacznej poprawy czasu wykonania.

podpytanie 3:

Czy mam rację, że metadane w wygenerowanych plikach obiektowych są głównym problemem?

Odnośnie linkowania: tak.

Hugo
źródło