문제

의 장점은 무엇 헤더만 라이브러리고 당신은 왜 그것을 쓰는 방법에 반대를 넣고 구현으로 별도의 파일입니까?

도움이 되었습니까?

해결책

헤더 전용 라이브러리가 예를 들어 템플릿을 처리 할 때 유일한 옵션 인 경우 상황이 있습니다. 헤더 전용 라이브러리를 갖는

도 라이브러리가 사용될 수있는 다양한 플랫폼에 대해 걱정할 필요가 없습니다.구현을 구현할 때 일반적으로 구현 세부 사항을 숨기고 라이브러리를 헤더와 라이브러리 (lib, dll 또는 .so 파일)의 조합으로 배포 할 수 있습니다.물론 지원을 제공하는 모든 다른 운영 체제 / 버전에 대해 컴파일해야합니다.

구현 파일을 배포 할 수도 있지만 사용자가 사용하기 전에 라이브러리를 컴파일하는 사용자의 추가 단계를 의미합니다. 물론 이것은 케이스 별 기준에 적용됩니다.예를 들어, 헤더 전용 라이브러리는 때때로 코드 크기 및 컴파일 시간을 증가시킵니다.

다른 팁

의 혜택을 헤더만 라이브러리:

  • 단순화 프로세스를 구축 합니다.당신이 필요하지 않을 구축 라이브러리,그리고 당신은 필요 없을 지정 컴파일 된 라이브러리안 링크 단계의 버튼을 눌러 설치할 수 있습니다.이 있는 경우 컴파일 된 라이브러리,당신은 아마를 구축하고 여러 버전을 그것의:중 하나로 컴파일을 디버깅용으로 다른 최적화 활성화,그리고 아마 그러나 또 다른 제거의 기호입니다.어쩌면 더 많을 위한 다양한 플랫폼을 지원하는 시스템입니다.

의 단점 헤더만 라이브러리:

  • 더 큰 개체 파일이 있습니다.모든 인라인 메서드에서 이 라이브러리에 사용되는 몇 가지 원본 파일을 얻을 것이 약한 기호,out-of-라인에서 정의를 컴파일한 개체에 대한 파일에는 소스 파일입니다.이 컴파일러 또한 속도가 느려집 linker.컴파일러를 생성하는 모든 볼록한 다음 링커는 그것을 필터링니다.

  • 더 이상 컴파일할 수도 있습니다.외에도 문제를 부풀게 위에서 언급한 바와 같이,컴파일이 오래 걸릴 것이기 때문에 이 헤더들은 본질적으로 더 큰 가진 헤더만 라이브러리 보다 컴파일 된 라이브러리입니다.그 큰 헤더가 필요로 구문 분석하는 각 소스 파일을 사용하는 라이브러리입니다.또 다른 요소는 사람들 헤더 파일의 헤더에서만 라이브러리를 #include 헤더에 필요한 인라인 정 뿐만 아니라 헤더 필요한 것입했다는 라이브러리 구축되으로 컴파일 된 라이브러리입니다.

  • 더 얽힌 컴파일할 수도 있습니다.당신은 더 많은 것을 얻을 의존성을 가진 헤더만 라이브러리기 때문에 추가 #includes 에 필요한 헤더만 라이브러리입니다.의 구현을 변경할 몇 가지 주요 기능은 라이브러리에서 당신이 필요가 있습니다 다시 컴파일하는 전체 프로젝트입니다.는 변경에 대한 소스 파일을 컴파일 된 라이브러리고 당신이해야 할 모든 당신이 다시 컴파일된 하나의 라이브러리 소스 파일 업데이트를 컴파일 된 라이브러리는 새로운.o 파일을 다시 연결합니다.

  • 열심히 인간을 위한 읽을 수 있습니다.심지어 최고의 문서는 사용자의 도서관 자주하 리조트를 읽는 헤더에 대한 라이브러리입니다.헤더에서 헤더만 라이브러리로 가득 차 있으로 구현하는 방법으로 얻을의 이해 인터페이스입니다.으로 컴파일 된 라이브러리,모든 당신이 볼 인터페이스 및 간략한 논평에서 무엇을 구현은,그리고 일반적으로 당신이 원하는 모든.그건 정말 해야 합니다.당신이 없을 알고 구현 정보를 사용하는 방법을 알고 있습니다.

이것은 이것이 오래된 스레드라는 것을 알고 있지만 아무도 ABI 인터페이스 또는 특정 컴파일러 문제를 언급하지 않았습니다. 그래서 나는 내가 할 것이라고 생각했다.

이것은 기본적으로 헤더를 사람들에게 배포하거나 헤더에 모든 것을 갖는 VS를 재사용하는 헤더가있는 라이브러리를 작성하는 개념을 기반으로합니다. 머리글과 소스 파일을 재사용하고 모든 프로젝트 에서이 항목을 다시 컴파일하는 것을 생각하는 경우 실제로 적용되지 않습니다.

기본적으로 C ++ 코드를 컴파일하고 하나의 컴파일러가있는 라이브러리를 작성하면 사용자는 동일한 컴파일러의 다른 컴파일러 또는 다른 버전의 다른 버전으로 해당 라이브러리를 사용하려고 시도합니다. 이는 바이너리로 인해 링커 오류 또는 이상한 런타임 동작을 얻을 수 있습니다. 비 호환성.

컴파일러 공급 업체는 종종 버전간에 STL의 구현을 변경합니다. STD :: 벡터를 허용하는 라이브러리에 함수가있는 경우 라이브러리가 컴파일 될 때 해당 클래스의 바이트가 배치 될 예정입니다. 새로운 컴파일러 버전에서 공급 업체는 STD :: Vector를 향상시키는 효율성을 향상 시켰습니다. 사용자 코드는 다른 구조를 가질 수있는 새 클래스를보고 새로운 구조를 라이브러리에 전달합니다. 모든 것이 거기에서 내리막 길을 걷습니다 ... 이것은 라이브러리 경계를 가로 질러 STL 개체를 전달하지 않는 것이 좋습니다. C 런타임 (CRT) 유형에도 동일하게 적용됩니다.

CRT에 대해 이야기하면서, 라이브러리와 사용자의 소스 코드에 대해서는 일반적으로 동일한 CRT에 대해 링크되어야합니다. Visual Studio를 사용하면 멀티 스레드 CRT를 사용하여 라이브러리를 작성하지만 사용자는 다중 스레드 디버그 CRT에 대한 사용자가 링크하여 라이브러리가 필요로하는 기호를 찾을 수 없기 때문에 링크 문제가 발생합니다. 나는 그것이 어떤 기능을 기억할 수 없지만 Visual Studio 2015 Microsoft는 하나의 CRT 기능을 인라인으로 만들었습니다. 갑자기 CRT 라이브러리가 아니므로 CRT 라이브러리가 아니므로 링크 시간에 더 이상 할 수 없으며이 생성 된 링크 오류가 발생하지 않았습니다. 그 결과이 라이브러리가 Visual Studio 2015로 재 컴파일해야했습니다.

Windows API를 사용하지만 다른 유니 코드 설정으로 라이브러리 사용자에게 빌드하는 경우 링크 오류 또는 이상한 동작을 얻을 수도 있습니다. 이는 Windows API가 Unicode 또는 ASCII 문자열 및 Project의 유니 코드 설정을 기반으로 올바른 유형을 자동으로 사용할 수있는 매크로 / 정의를 사용하는 함수가 있기 때문입니다. 라이브러리 경계에서 문자열을 전달하는 경우 틀린 유형 인 라이브러리 경계를 통과하면 런타임에 사물이 중단됩니다. 또는 프로그램이 처음부터 링크하지 않음을 알 수 있습니다.

다른 제 3 자 라이브러리의 라이브러리 경계를 통과하는 객체 / 유형을 통과하는 것도 해당합니다 (예 : 고유 벡터 또는 GSL 매트릭스). 제 3 자 라이브러리가 라이브러리를 컴파일하고 사용자가 코드를 컴파일하는 동안 헤더를 변경하면 상황이 끊어집니다.

기본적으로 도서관 경계를 통과 할 수있는 유일한 작업은 유형 및 일반 오래된 데이터 (POD)로 구성됩니다. 이상적으로 모든 포드는 자신의 헤더에 정의 된 구조체에 있어야하며 제 3 자 헤더에 의존하지 않습니다.

헤더 만 라이브러리 만 제공하는 경우 모든 코드가 동일한 컴파일러 설정과 동일한 헤더로 컴파일되므로 이러한 많은 문제가 사라집니다 (세 번째 부분적으로 라이브러리 버전을 제공하고 사용자가 사용하는 사용자가 API 호환 가능) ).

그러나, 증가 된 컴파일 시간과 같이 위에서 언급 한 부정적인 부분이있다. 또한 비즈니스를 실행할 수 있으므로 모든 사용자가 모든 사용자에게 모든 사용자에게 모든 사용자에게 훔치는 것을 훔치지 않을 수도 있습니다.

주 "혜택"은 소스 코드를 제공해야합니다. 그래서 기계에 오류 보고서와 컴파일러가있는 오류 보고서로 끝납니다. 들어 본 적이 없어.라이브러리가 완전히 템플릿 일 때, 당신은 가지고 있지 않습니다. 훨씬 선택하지만, 선택을 할 때, 헤더는 대개 가난한 것입니다. 엔지니어링 선택.(반면에, 물론 헤더만을 의미합니다. 통합 절차를 문서화 할 필요가 없습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top