Linux에서 Intel C / C ++ 컴파일러를 사용하여 Windows에서 링크 될 오브젝트 파일을 작성할 수 있습니까?


12

왜?

소스에 따라 인텔 컴파일러는 아마도 x86 아키텍처를위한 가장 빠른 실행 파일을 생성하는 컴파일러 일 것입니다 (5 ~ 100 % 실행 시간 개선).

인텔은 Linux 용 컴파일러를 비상업적 라이센스로 무료로 제공합니다 (저는 인텔의 비 상업용 소프트웨어 개발 페이지에서 무료라고 생각합니다 ). 학생을위한 무료 비상업적 라이센스도 있지만이 세 가지 주요 운영 체제 모두에 대해 도구가 제공되지만이 라이센스는 적용되지 않습니다 (평판 제한으로 인해 링크가 끊어짐).

나는 (학생이 아닌) Windows 용 실행 파일 및 동적 링크 라이브러리 (및 가능하면 OS)를 생성하기 위해 링크 될 수있는 객체 파일을 컴파일하기 위해 비상업적 라이센스 하에서 실행 속도 향상을 위해 인텔 컴파일러를 사용할 수 있기를 원합니다. 엑스)

자세한 내용은:

문서 에서 유추 한 것은 인텔 컴파일러가 플랫폼의 주요 컴파일러와 호환되는 객체 파일을 생성한다는 것입니다.

하위 질문 :

  1. Windows 및 Linux (현재 버전)에서 gcc, g ++, cl, mingw32, icc, icpc 및 icl의 객체 파일 형식은 무엇입니까?
  2. mingw32 크로스 컴파일러 툴체인의 일부를 사용하여 목표를 달성 할 수 있습니까?
  3. 생성 된 객체 파일의 메타 데이터가 주요 문제라는 것이 맞습니까?

ad 2 :
mingw32-objcopy는 Linux의 Intel 컴파일러 출력 (아마도 ELF)을 Microsoft 호환 COFF (이전 가능한 개체 파일 제외)로 변환 할 수있는 것 같습니다. 누군가 이것이 실제로 작동하는지 확인할 수 있습니까 (사소한 응용 프로그램의 경우)?


1
+1. 흥미로운 질문입니다.
Neil

와인을 보았습니까? AFAIK, Wine은 Linux에서 Windows 실행 파일을 빌드 할 수있는 툴체인을 제공합니다. 아마도 당신은 그것으로 icc를 연결할 수 있습니다. Wine 내에서 Windows icc를 성공적으로 실행하고 ming32 크로스 컴파일 툴체인과 연결할 수도 있습니다. 나는 그것을 시도하지는 않았지만 충분한 조사를 통해 가능해야한다고 생각합니다.
tdammers

@tdammers WineHQ 에 따르면 Linux에서 Windows 실행 파일을 빌드하는 툴체인은 내가 잘못하지 않은 경우 mingw32입니다.
휴고

인텔 포럼에서 답은 "아니오"인 것으로 보입니다 : software.intel.com/en-us/forums/topic/282588
Vitor Py

@VitorBraga 나는 다음과 같은 질문을 해석했다 : "인텔 컴파일러는 직접 크로스 컴파일 할 수 있습니까?" 대답은 "아니오"입니다 (필자가 알 수있는 한 필요한 옵션과 라이브러리가 누락되었습니다). 그러나 컴퓨터 아키텍처 (IA32, AMD64)는 제 경우에는 동일하며 Windows 라이브러리 만 사용하는 경우 Linux에서 프로그램을 컴파일하려면 Windows 라이브러리와 연결되어 Windows 실행 파일을 만드는 경우 Windows에서 실행할 수있는 실행 코드가 필요합니다.
휴고

답변:


1

크로스 컴파일러를 사용하여 Linux 빌드 머신에서 Windows 실행 파일을 작성할 수 있습니다. 그러나 인텔 이러한 크로스 컴파일러를 제공 하지 않습니다 .

하위 질문에 대답하려면 :

Windows 및 Linux (현재 버전)에서 gcc, g ++, cl, mingw32, icc, icpc 및 icl의 객체 파일 형식은 무엇입니까?

오브젝트 파일의 형식은 운영 체제 (또는이를 빌드하는 데 사용 된 컴파일러)에 의해 효과적으로 결정됩니다. Windows의 경우 이는 PE (Portable Executable) 형식이며 Linux의 경우 ELF 형식입니다.

mingw32 크로스 컴파일러 툴체인의 일부를 사용하여 목표를 달성 할 수 있습니까?

아니요. 관련 부분은 코드 생성기입니다. 코드 생성기는 올바른 개체 형식을 생성하는 부분과 생성 된 코드의 속도를 향상시키는 인텔 컴파일러의 부분입니다.

생성 된 객체 파일의 메타 데이터가 주요 문제라는 것이 맞습니까?

아니요. 한 가지 문제이지만 더 많은 문제가 있습니다. 보다 근본적인 문제는 매개 변수가 커널 및 / 또는 표준 라이브러리로 전달되는 방식의 잠재적 차이입니다. IIRC에서 이러한 규칙은 Windows와 Linux간에 다릅니다.


0

대답은 거의 그렇습니다. 나는 gcc를 사용하여 Linux 상자에서 크로스 컴파일 Windows 바이너리 ( mingw32 통해 )가 쉽게 가능하다는 것을 알고 있습니다-분명히 와인에서 작동하지 않는 한 Linux에서 프로그램을 실행할 수는 없지만 Windows 바이너리는 이런 식으로 바이너리입니다.

그러나 인텔 컴파일러 에이 옵션이 있는지 모르겠습니다. 그렇습니다.

Windows의 객체 형식은 PE 이고 Linux의 경우 ELF 입니다.


msdn 에 따르면 : "컴파일러는 COFF (Common Object File Format) 객체 (.obj) 파일을 생성합니다."<br/>
Hugo

좋아, 그것은 작동하지 않았다. Wikipedia PE에 따르면 COFF에서 파생되었으며 두 파일 형식 모두 개체 파일 형식과 실행 파일 형식으로 사용할 수 있습니다.
휴고

0

C 코드가 Microsoft의 사용자 지정 호출 규칙을 사용하지 않는 (직접적으로) 연결되지 않으면 MinGW를 사용할 가능성이 있습니다 objcopy. 이것을 사용하여 어셈블 된 객체 파일을 변환했지만 컨벤션 호출에 대해 걱정할 필요가 없었습니다.

GCC 또는 clang이 원하는 것을 정확하게 수행하는 대신이 작업을 수행하는 데 시간을 할애합니다. 그러한 속도 향상이 정말로 중요한 경우 인텔 컴파일러로 Linux 바이너리를 컴파일하고 코드 속도를 높이는 것이 무엇인지 정확히 확인하십시오. 다른 모든 방법이 실패하면 어셈블리를 패치 할 수 있습니다.


0

다음 답변을 제안합니다.

문맥과 관련하여 (아무쪽으로 기울여) 명확한 것일 수 있습니다.

설명 : "leaning"부분과 관련하여 :이 작업을 수행하는 데 총 시간 낭비는 아니지만 ( "put"부분) 이 답변 을 고려 하면 Intel에 비해 실행 시간이 향상되지 않을 수 있습니다. 툴체인 전용. 관련 부분은 컴파일러에 대한 링커 및 런타임 피드백입니다 (전체 프로그램 최적화, 프로파일 가이드 최적화, 링크 타임 코드 생성).

추가 세부 정보 : MinGW FAQ
에 따르면 라이브러리와 DLL을 사용하는 데 문제가있을 수 있습니다. "dll은 다른 Windows 컴파일러에서 상당히 이식 가능해야하지만 라이브러리 파일 (.lib 또는 .a)을 통해 dll에 액세스하는 것은 불가능합니다. 파일 형식은 특정 컴파일러에만 적용되며 컴파일러에서 지원하지 않는 한 다른 컴파일러와 함께 사용할 수 없습니다. "

답을 완성하려면 :
하위 질문 1 :

Windows 및 Linux (현재 버전)에서 gcc, g ++, cl, mingw32, icc, icpc 및 icl의 객체 파일 형식은 무엇입니까?

Windows의 모든 컴파일러에 대한 기본 오브젝트 파일 형식은 COFF입니다 (예 : PE 변형). Linux에서 모든 컴파일러의 기본 객체 파일 형식은 ELF입니다.

하위 질문 2 :

mingw32 크로스 컴파일러 툴체인의 일부를 사용하여 목표를 달성 할 수 있습니까?

연결 부분에 대해서는 가능하지만 실행 시간이 크게 향상되지는 않을 것입니다.

하위 질문 3 :

생성 된 객체 파일의 메타 데이터가 주요 문제라는 것이 맞습니까?

연결에 관하여 : 예.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.