2017-12-03 14 views
1

나는 리눅스 또는 Macos에서 Windows 용 정적 라이브러리를 컴파일하는 방법을 찾고 있는데, this one과 같은 Windows 용 .a 라이브러리를 생성하는 크로스 컴파일러가있는 것 같다. 내가 원하는 것은 아니지만, Windows 용 .lib 정적 라이브러리 파일 (Visual Studio 용)이 바람직합니다. 저는 Windows 가상 머신을 실행할 수 있고 Visual Studio를 사용할 수 있지만 너무 무거 우며 명령 줄에서 수행 할 수 없다는 것을 알고 있습니다. 유닉스와 같은 운영체제 (리눅스, 맥 OS 등)을 정적 라이브러리를 들어리눅스 또는 Macos에서 Windows 용 정적. lib 라이브러리를 컴파일하는 방법

답변

1

는 오브젝트 파일의 ar archive을 의미한다. ar은 GNU 일반 목적의 아카이버입니다. 아카이브에 집착하는 파일의 종류에는 상관이 없습니다. 그것은 객체 파일 일 때 "정적 라이브러리"라고 부르는 사용자 정의입니다. 그리고 *.a이라는 ar 아카이브의 사용자 정의입니다. 그것을 *.lib 또는 무엇이든 부를 수 있습니다. Visual Studio를 들어

하는 정적 라이브러리은 일반적으로 마이크로 소프트 도구 LIB에 의해 만들어진 PE 형식의 오브젝트 파일 의 아카이브를 의미한다.

Microsoft LIB 아카이브의 형식은 실제로 Unix ar 아카이브의 형식과 동일합니다. 오래 전에 마이크로 을 채택했습니다. 당신이 ar*.lib에 다음 배포판의 PE 크로스 컴파일러 를 사용하여 보관 리눅스에 대한 몇 가지 PE 오브젝트 파일을 컴파일하는 경우

그래서, 당신은 자신에게 Visual Studio를 사용하여 Windows 에 가서 좋은 정적 라이브러리를 가지고 컴파일러.

글쎄, 당신은 그 오브젝트 파일들이 C 바이너리 인터페이스를 가지고있는 한 오래 가질 수 있습니다. 그들 중 누구라도 C++ 인터페이스를 사용하면 쓸모가 없습니다. Microsoft 및 GCC C++ 컴파일러는 다른 이름 - 맹 글링 프로토콜을 사용하며 그렇지 않으면 ABI 호환되지 않습니다.

데모

우리는 정적 라이브러리의 일부 소스 코드를 리눅스에서 시작 :

에서는 hello.c

#include <stdio.h> 

void hello(void) 
{ 
    puts("Hello world"); 
} 

크로스 컴파일 :

$ x86_64-w64-mingw32-gcc-win32 -o hello.obj -c hello.c 
$ ar rcs hello.lib hello.obj 

이 그 다음 무슨 프로그램이 hello.lib와 연결되는 :

주 0 정적 라이브러리를 확인합니다.

E:\develop\so\xstatlib>dir 
Volume in drive E is VBOX_imk 
Volume Serial Number is 0000-0804 

Directory of E:\develop\so\xstatlib 

03/12/2017 18:37    72 main.c 
03/12/2017 18:29    978 hello.lib 
03/12/2017 18:26    66 hello.c 
03/12/2017 18:27    832 hello.obj 
       4 File(s)   1,948 bytes 
       0 Dir(s) 153,282,871,296 bytes free 

컴파일하고 우리의 프로그램을 사용하고 있습니다 :

extern void hello(void); 

int main(void) 
{ 
    hello(); 
    return 0; 
} 

C 이제 우리는 우리가 우리가 단지 공유 폴더를 통해 생성 한 파일을보고있는 윈도우 10 VM에 홉 :

E:\develop\so\xstatlib>cl /Fehello.exe main.c hello.lib 
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x64 
Copyright (C) Microsoft Corporation. All rights reserved. 

main.c 
Microsoft (R) Incremental Linker Version 14.11.25547.0 
Copyright (C) Microsoft Corporation. All rights reserved. 

/out:hello.exe 
main.obj 
hello.lib 

실행을 :

E:\develop\so\xstatlib>hello 
Hello world 
+0

'extern "C"'는 무엇입니까? C++ 이름 맹 글링과 관련하여 gcc/VisualStudio와의 호환성에 도움이됩니까? –

+1

@BarmakShemirani 그렇습니다. 물론 extern "C"의 범위에있는 API는 유효한 C API로 시작해야합니다. 나는 더 정확한 표현을 만들었습니다. –

+0

이렇게 많은 설명과 예를 들어 주셔서 대단히 감사합니다. – Ryan