2010-01-26 9 views
4

Windows에서 *.a*.dll의 차이점은 무엇입니까? 내가 이해하는 것으로부터 모든 * .o 파일을 *.a으로 패키징 할 수 있습니다. 이것은 리눅스에서 다른 응용 프로그램이 사용할 수있는 배포 가능 파일입니다.Windows에서 * .a와 * .dll의 차이점

*.a*.dll의 차이점은 무엇입니까? 그들은 상호 교환이 가능합니까? 신청서에 *.a 링크가 필요한 경우이를 *.dll에 연결할 수 있습니까?

답변

4

제외 : Linux 기반 도구 체인을 사용하지 않는 한 일반 Windows 개발 도구에는 정의 된 * .a 형식이 없습니다. 아마도 Windows의 정적 라이브러리, 일명 .lib을 언급했을 것입니다.

DLL은 Unix의 공유 라이브러리 (* .so)와 동일하며, 링커가 정적 라이브러리에 링크 할 것으로 예상되는 경우 일반적으로 공유 라이브러리/dll에 연결할 수 없습니다.

+0

공유 객체 라이브러리는 Linux에서'* .so '확장자를 가지고 있습니다. 실제로는 뉴스가 아닐지라도 알릴 가치가 있습니다 :-P – jdehaan

+0

하지만 dll에서 정적 라이브러리를 추출한 다음 추출 된 라이브러리. – erikkallen

0

gcc가있는 Linux에서는 *.a (정적으로 링크 할 수있는 함수 집합을 제공하는 데 사용됨)과 *.so (동적으로 링크하기 위해)이라는 공유 라이브러리라는 두 종류의 파일이 표시됩니다. 대부분의 컴파일러에서 Windows에서의 해당 기능은 *.lib*.dll입니다.

그래서 *.a*.dll은 전혀 바꿔 쓸 수 없습니다. 또한 windows 아래에 *.lib이 고정 주소를 사용하여 정적 및 동적 연결에 모두 사용될 수 있다는 딜레마가 있습니다. 또 다른 방법은 완전히 동적으로 GetProcAddress으로 바인딩하는 것입니다. 그러나 래퍼를 만드는 데 오버 헤드가 필요합니다. 다른 버전에서 dll을 작동 시키려면 원하는 것일 수 있습니다.

동적 라이브러리를 동적으로 링크하는 데 사용되는 것과 비교하면 정적 라이브러리의 크기가 크다는 것을 알 수 있습니다. 필자의 프로젝트에서는 모든 것을 다시 연결하지 않고 이전 응용 프로그램을위한 새로운 DLL을 새로 추가하는 기능을 좋아하기 때문에 실제로는 GetProcAddress으로 진행됩니다.

+0

정적 라이브러리가 동적 라이브러리보다 커야하는 이유는 없습니다. 정적 라이브러리를 사용하는 * 응용 프로그램 *은 일반적으로 더 큽니다. –

+0

나는 dll 연결을위한 lib 파일이 함수의 주소만을 담고 있다는 것을 의미했지만, 정적 인 lib는 모든 것을 담고있다. lib 파일과 dll을 해당 lib에 비교한다는 것이 명확하지 않을 수 있습니다. 감사합니다, Jaap – jdehaan

1

* .a는 Linux 정적 라이브러리이므로 모든 형식이 완전히 다르기 때문에 windows .dll (동적 연결 라이브러리)과 전혀 호환되지 않습니다. 응용 프로그램을 작성한 .a에 링크해야하는 경우 Linux 정적 라이브러리 (가능한 경우)를 생성 한 소스 코드를 Windows 정적 라이브러리 (.lib)로 다시 컴파일하고 코드를 컴파일해야합니다.