나는 리눅스 또는 Macos에서 Windows 용 정적 라이브러리를 컴파일하는 방법을 찾고 있는데, this one과 같은 Windows 용 .a 라이브러리를 생성하는 크로스 컴파일러가있는 것 같다. 내가 원하는 것은 아니지만, Windows 용 .lib 정적 라이브러리 파일 (Visual Studio 용)이 바람직합니다. 저는 Windows 가상 머신을 실행할 수 있고 Visual Studio를 사용할 수 있지만 너무 무거 우며 명령 줄에서 수행 할 수 없다는 것을 알고 있습니다. 유닉스와 같은 운영체제 (리눅스, 맥 OS 등)을 정적 라이브러리를 들어리눅스 또는 Macos에서 Windows 용 정적. lib 라이브러리를 컴파일하는 방법
답변
는 오브젝트 파일의 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
'extern "C"'는 무엇입니까? C++ 이름 맹 글링과 관련하여 gcc/VisualStudio와의 호환성에 도움이됩니까? –
@BarmakShemirani 그렇습니다. 물론 extern "C"의 범위에있는 API는 유효한 C API로 시작해야합니다. 나는 더 정확한 표현을 만들었습니다. –
이렇게 많은 설명과 예를 들어 주셔서 대단히 감사합니다. – Ryan