2010-04-10 5 views
18

나는 모두 "공통"클래스의 정적 라이브러리를 공유 할 수있는 많은 프로젝트가 있습니다.정적 라이브러리,하지만 헤더가 여전히 필요합니까?

정적 라이브러리를이 클래스에서 없애고 내 프로젝트에서 링크하면 기본 프로젝트의 정적 라이브러리에있는 클래스의 헤더가 여전히 필요합니다.

그런 다음 정적 라이브러리의 이점은 무엇입니까?

Adobe와 같은 회사는 어떻게 이러한 방식으로 거래합니까?

답변

32

정적 라이브러리를 사용하면 라이브러리를 만들고 많은 프로젝트에서 해당 라이브러리를 사용할 수 있습니다. 헤더 파일에 대한

의 필요성 : 라이브러리를 사용하여 프로젝트는 프로그램 및 라이브러리의 독립적 인 컴파일되어 있기 때문에

는 해당 프로그램이 사용하고있는 것들의 선언을 알 필요가있다. 그렇지 않으면 컴파일러가 올바른 코드를 작성하고 있음을 어떻게 알 수 있습니까?

컴파일러는 소스 코드만을 입력으로 받아 출력합니다. 입력시 컴파일 된 오브젝트 파일이나 정적 라이브러리를 처리하지 않습니다.

라이브러리에 연결의 필요성 :

그래서 헤더를 가진 당신의 프로젝트에 유효한 코드를 작성 할 수 있지만이 시간을 연결하는 때 당신은 포함 된 정의를 제공해야합니다 정적 라이브러리 내부.

링커는 모든 개체 파일 (컴파일 된 코드)과 모든 정적 라이브러리를 가져 와서 실행 파일 또는 이진 파일을 만듭니다.

정적 라이브러리에 대한 자세한 정보 (비교 효과, 동적, 등등 ...) : 무엇보다도

, 당신이 하나와 끝까지하지 않도록 라이브러리로 프로젝트를 분리하는 좋은 거대한 모 놀리 식 프로젝트.

이 방법으로 소스 코드 (일반적으로 .cpp 파일)를 배포 할 필요가 없습니다.

공용 라이브러리를 사용하는 모든 프로젝트에 모든 .cpp 파일을 단순히 포함하려는 경우 매번 .cpp 파일을 컴파일해야합니다.

동적 라이브러리에 비해 정적 라이브러리의 장점은 프로그램 자체가 포함되어 있고 라이브러리의 올바른 버전을 사용하고 있다는 것을 항상 확신 할 수 있다는 것입니다 (실행 파일 자체로 컴파일되므로). 또한 동적 연결에 비해 속도면에서 약간의 이점이 있습니다.

동적 라이브러리에 비해 정적 라이브러리의 단점은 각 실행 파일마다 자체 복사본이 필요하고 파일이 동적으로로드되지 않아 다른 버전의 라이브러리를 스왑 할 수 없기 때문에 파일 크기가 커진다는 점입니다. 귀하의 질문에 다시

는 :

전형적인 회사는 광범위하게 모두 정적 및 동적 라이브러리를 사용하게됩니다 어떻게 기업이 처리 할.

+0

@Brian - 알겠습니다. OS X에서 동적 라이브러리에 대한 참조가 있습니까? – MLS

+1

두 종류의 라이브러리에 대한 또 다른 이점 : 컴파일 시간 단축. – WhirlWind

+0

http://developer.apple.com/Mac/library/documentation/DeveloperTools/Conceptual/DynamicLibraries 그리고 OS X에 대해 이야기하고 있다면 아마도 (기본적으로) 프레임 워크를 구축하는 방법을 조사하고 싶을 것입니다. 라이브러리와 해당 헤더를 함께 패키징하는 방법 –

2

정적 라이브러리를 사용하는 일반적인 방법은 헤더를 라이브러리를 설치하는 동시에 적절한 위치에 설치하는 대상을 사용자의 Makefile (또는 사용하는 빌드 시스템)에 저장하는 것입니다.

정적 라이브러리는/usr/local/lib에서 끝나며 헤더는/usr/local/include 또는 어디로 가든됩니다.

0

또한 정적 파일에 대한 링크는 오브젝트 파일에 대한 링크와 비교할 때 더 작은 최종 실행 파일이 될 수 있습니다. 그 이유는 특정 객체 파일 (정적 라이브러리에 포함되어 있음)에서 함수를 호출하지 않으면 링커가 해당 함수의 코드를 최종 실행 파일에 포함시키지 않기 때문입니다. Extraneous Library Linkage

관련 문제