2013-04-15 4 views
2

저는 C++을 처음 접했고 컴파일과 링크에 어려움을 겪고 있습니다. 최근 cmake와 make를 사용하여 Boost (Cmake does not find boost 1.51 (windows 8))를 사용하는 라이브러리 (mlpack)를 다시 컴파일했습니다.C++ windows 바이너리 : MinGW와 함께 사용되는 조건

첫 번째 시도에서 Windows 용 사전 컴파일 된 바이너리를 다운로드했습니다. 이것은 잘 작동하지 않았고, 나는 MinVW가 아니라 MSVC를 위해 사용하고있는 바이너리가 문제라고 설명했다. 그리고 실제로 MinGW를 사용하여 부스트를 다시 컴파일 한 후에는 문제가 없었습니다.

여기서 MSVC와 MinGW의 바이너리 간의 차이점에 대해 직관을 얻고 싶습니다. 나 (순진하게?) 바이너리는 OS/프로세서에 한정적이라고 생각했습니다. MinGW에서 사용할 수 없게하는 MSVC 용 바이너리는 무엇입니까?

답변

2

순수 C API를 내보내는 한 MSVC 및 MinGW (일반적으로 다른 C 컴파일러에 적용됨)에서 생성 된 아티팩트 (정적/공유 라이브러리)를 결합하는 것은 상대적으로 쉽습니다. 이것은 C API를 매우 이식성있게 만들어 주며 많은 대중적인 라이브러리가 여전히 순수한 C API를 선호하는 주된 이유 중 하나입니다.

C++의 이야기는 완전히 다릅니다. 서로 다른 C++ 컴파일러에서 생성 된 아티팩트 간의 적절한 상호 운용성에 가장 큰 걸림돌은 name manglingapplication binary interface (ABI)의 차이입니다. 이것은 MinGW 및 MSVC뿐만 아니라 일반적으로 모든 C++ 컴파일러에 적용됩니다. 당신이 특히 MSVC와는 MinGW 사이의 상호 운용성 함정에 대한 자세한 내용을 원한다면, 나는 다음과 같은 기사를 읽어 보시기 바랍니다 :

  1. Interoperability of Libraries Created by Different Compiler Brands
  2. Binary-compatible C++ Interfaces
1

간단합니다.

Windows는 French입니다.
MinGW는 French, GermanEnglish을 말합니다.
유닉스 시스템은 German입니다.


MSVC 바이너리는 French으로 작성됩니다.
MinGW 바이너리는 FrenchAngloGerman에 기록됩니다.
UNIX 바이너리는 German에 기록됩니다. 이 모든 것을 이해하기 전에


는 윈도우 FrenchGermanEnglish의 일부를 번역 할 수는 MinGW이 필요합니다.


MinGW는 다른 프로그램과 다릅니다. 그것은 기본적으로 Windows와 Linux 사이의 미니 OS입니다. 따라서 대부분 제대로 작동하려면 수정 된 바이너리 형식이 필요합니다. MinGW에서 Windows에서 프로그램을 개발한다고해서 문제가없는 순수한 Windows에서 실행된다는 것을 의미하지는 않습니다. 프로그램과 함께 사용한 MinGW 라이브러리와 실행 파일을 여전히 배포하거나 배포해야합니다.

+0

난 아직도 혼란 스러워요. 이것은 일단 당신이 당신의 시스템을 위해 컴파일하면, 당신의 라이브러리는 당신의 시스템에있는 모든 프로그램에 의해 여전히 사용 가능하지 않다는 것을 의미합니까? 모든 기존 컴파일러에 대해 컴파일해야한다는 의미입니까?그리고 특정 컴파일러 용으로 컴파일 된 바이너리를 제외하고 결코 바이너리를 다운로드 할 수 없습니까? 언어 비유를 위해 MSVC 라이브러리는 프랑스어로, MinGW는 프랑스어로도, 창문에는 프랑스어로도 안돼, 안돼? – Vince

+0

@Vince 나는 그것을 더 설명하려고 노력했다. 그러나 Haroogan이 문제가 발생하는 이유에 대한 좋은 링크를 제공했다고 생각합니다. 너는 그들을 체크 아웃해야한다. – stardust

+0

감사합니다. 그냥 명확히하기 : 이제 iconv 바이너리를 다운로드하고 iconv.lib가 포함 된 폴더 lib가 있습니다 ... mingw를 사용하여 다른 라이브러리를 컴파일 할 때이 라이브러리에 대한 링크가 작동한다고 가정하는 것이 합리적이지 않습니까? 이 도서관들이 괜찮은지 아닌지 어떻게 알 수 있습니까? – Vince