.dll
또는 .so
공유 라이브러리 (런타임에 링크 됨).a
및 .lib
정적 라이브러리 (컴파일 시간에 연결이)입니다. 이것은 Windows와 Linux의 차이가 아닙니다.
차이점은 처리 방법입니다. 참고 : 차이점은 세관에만 있으며, 어떻게 사용됩니까? 실제로 아무도이 작업을 수행하지 않는다는 점을 제외하고 Windows를 Linux 방식으로 빌드하는 것은 그다지 어렵지 않습니다.
dll을 사용하거나 자체 바이너리에서도 함수를 호출하면 간단하고 명확한 방법이 있습니다. 예를 들어 C에서 우리는 다음을 볼 수 있습니다.
int example(int x) {
...do_something...
}
int ret = example(42);
그러나 asm 수준에서는 많은 차이가있을 수 있습니다. 예를 들어, x86에서 call
opcode가 실행되고 42
스택에 제공됩니다. 또는 일부 레지스터에서. 아니면 어디서나. dll을 작성하기 전에 아무도 그것을 모른다 어떻게 사용되는지 알 수 없습니다. 또는 프로젝트가 어떻게 그것을 사용하기를 원하는지, 현재 존재하지 않는 컴파일러 (또는 언어로 작성)로 작성 가능하거나 dll 개발자에게는 알려지지 않았습니다.
예를 들어, 기본적으로 C와 Pascal은 모두 스택에서 인수를 가져오고 반환 값을 가져옵니다. 그러나 서로 다른 순서로 수행합니다 . 컴파일러에 따라 최적화하여 레지스터의 함수간에 인수를 교환 할 수도 있습니다.
올바르게 볼 때, 윈도우 사용자는 DLL을 구축하여, 우리는 또한 최소한의를 만들 수 있다는 것입니다 .a
/.lib
그것입니다. 이 최소 정적 라이브러리는 래퍼 일 뿐이며 해당 DLL의 기호 (기능)는이를 통해 도달합니다. 필요한 asm 수준의 통화 변환이 이루어집니다.
장점은 호환성입니다. 단점은 .dll 만 있으면 해당 함수를 호출하는 방법을 알아내는 데 어려움을 겪을 수 있다는 것입니다. dll 개발자가 당신에게을 제공하지 않으면 dll.a
사용법을 해킹 작업으로 만듭니다 . 따라서 주로 폐쇄 목적으로 사용되므로 SDK에 대한 추가 현금을 얻는 것이 더 쉽습니다.
또 다른 단점은 동적 라이브러리를 사용하더라도이 작은 래퍼를 정적으로 컴파일해야한다는 것입니다.
Linux에서 dll의 이진 인터페이스는 표준이며 C 규칙을 따릅니다. 따라서 .a
공유 라이브러리간에 이진 호환성이 필요하지 않으며 Microsoft 사용자 지정의 이점이 없습니다.