문제

Windows에서 MSVC를 사용하여 생성 된 정적 라이브러리 *.lib가 있습니다. 라이브러리의 크기는 70kb입니다. 그런 다음이 라이브러리를 연결하는 응용 프로그램이 있습니다. 그러나 이제 최종 실행 파일 (*.exe)의 크기는 라이브러리보다 29kb입니다. 내가 알고 싶은 것은 다음과 같습니다.

  1. 라이브러리가 정적으로 연결되어 있기 때문에 실행 가능한 크기에 직접 추가해야한다고 생각했으며 최종 EXE 크기는 그 이상이어야합니까? Windows Exe 형식도 이진 데이터의 압축을 수행합니까?

  2. Linux 시스템의 경우 Linux (*.a/*. la 파일)의 라이브러리 크기는 Linux 실행 파일 (*.out)의 크기와 어떻게 관련이 있습니까?

-기원 후

도움이 되었습니까?

해결책

추가 부기 정보가 있습니다 .lib 최종 실행 파일에 필요하지 않은 파일. 이 정보는 링커가 실제로 링크 할 코드를 찾는 데 도움이됩니다. 또한 디버그 정보가 저장 될 수 있습니다 .lib 파일은 아니지만 .exe 파일 (디버그 정보가 LIB 파일의 OBJS에 저장되는 위치를 기억하지 못하면 다른 곳에있을 수 있습니다).

다른 팁

Windows와 Unix의 정적 라이브러리는 .obj/.o 파일 모음입니다. 링커는 이러한 각 객체 파일을보고 프로그램이 링크 해야하는지 결정합니다. 필요하지 않은 경우 객체 파일이 최종 실행 파일에 포함되지 않습니다. 이로 인해 라이브러리보다 작은 실행 파일로 이어질 수 있습니다.

편집 : MSALTERS가 지적한 것처럼 Windows에서 VC ++ 컴파일러는 이제 기능 레벨 링크를 활성화하는 객체 파일 생성을 지원합니다. 여기. 실제로 편집 및 만화는 편집 및 연속적으로 실행 파일의 가장 작은 부분을 교체 할 수 있어야하므로이를 필요로합니다.

정적 라이브러리에는 아마도 사용되지 않은 여러 기능이 포함되어있을 것입니다. 링커가 라이브러리를 기본 실행 파일과 연결하면 특정 함수가 사용되지 않고 (주소가 기능 포인터에 가져 오지 않고 저장되지 않음) 코드를 버립니다. 또한 재귀 적으로 수행 할 수 있습니다. 함수 A ()가 호출되지 않고 A ()가 B ()을 호출하지만 B ()가 다른 방법으로 호출되지 않으면 A () 및 B ()에 대한 코드를 제거 할 수 있습니다. Linux에서도 같은 일이 발생합니다.

부인 성명: 정적 연결을 다루고 나서 오랜 시간이 지났으므로 소금 한 덩어리로 대답하십시오.

당신은 다음과 같이 썼습니다. 나는 그것이 실행 가능한 크기에 직접 추가해야한다고 생각했고 최종 EXE 크기는 그 이상이어야합니까?

순진한 링커는 정확히 이런 식으로 작동합니다. CP/M 시스템에 대한 취미 개발을 할 때 (오래 전) 이것은 실제 문제였습니다.

그러나 최신 링커는 더 똑똑합니다. 원래 코드 또는 필요에 따라 참조 된 기능에서만 연결됩니다.

현재 답변에도 링커는 동일한 개체 코드가있는 경우 기능 정의를 제거 할 수 있습니다. 이는 템플릿 코드의 팽만감 효과를 줄이는 데 도움이됩니다.

정적 라이브러리에는 포함되어 있어야합니다 모든 기호는 소스 코드에 정의되어 있기 때문입니다 ~할 것 같다 특정 기호 만 필요한 실행 파일에 연결하십시오. 그러나 일단 실행 파일에 연결되면 어떤 기호가 사용되는지 정확히 알 수 있습니다. 따라서 링커는 사용하지 않은 코드를 사소하게 제거하여 파일 크기를 많이 줄일 수 있습니다. 마찬가지로, 중복 기호 (정적 라이브러리와 실행 가능에 따라 정의 된 내용은 단일 인스턴스로 병합됩니다.

@all : 포인터에 감사드립니다. @Greg Hewgill- 당신의 대답은 좋은 포인터였습니다. 감사.

내가 알게 된 대답은 다음과 같습니다.

1.) 라이브러리 구축 중에 MSVC (또는 비슷한 것)에서 "Keep Program Debug Databse"옵션이 켜져있는 경우에는 어떻게되면 라이브러리는이 디버그 정보가 크기를 부풀게합니다. 그러나 해당 라이브러리를 정적으로 포함시키고 실행 파일을 만들 때 링커는 EXE를 geenration하기 전에 라이브러리에서 모든 디버그 정보를 제거하므로 EXE 크기는 라이브러리의 크기보다 작습니다.

2.) "Keep Program Debug Databse"옵션을 비활성화했을 때, 최종 실행 파일보다 크기가 작은 라이브러리를 얻었습니다. 이것이 대부분의 상황에서 Nromal이라고 생각했습니다.

-기원 후

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