2014-06-19 4 views
0

하나의 큰 개체이 만들어지면서 서로 연결된 많은 개체 파일이 컴파일 된 프로그래밍 언어 (예 : C++)로 설정되는 이유는 무엇입니까?하나의 대형 오브젝트 파일 대신 많은 오브젝트 파일을 링크하는 이유는 무엇입니까?

예를 들어 (C++로 작성되었으므로 컴파일 된 언어에 적용될 수 있음) 프로젝트의 두 파일을 main.cppauxiliary.cpp으로 간주하십시오. 무엇 main.cppauxiliary.cpp의 차이는 main.oauxiliary.o로 컴파일 한 후 main.exe에 연결하고, #include auxiliary.cppmain.cppmain.o로 컴파일 및 main.exe에 연결되고되고있다? 내 지식으로는, 이들은 최소한 외면적으로 같은 결과를냅니다.

다국어 프로젝트의 경우에는 여러 개체가 필요하지만 그렇지 않은 경우가 있습니다. 여러 객체가 어떻게 든 링커에게 실행 파일을 만드는 데 더 많은 융통성을 부여합니까?

+0

수천 개의 클래스가 포함 된 수십만 줄 길이의 단일 cpp 파일에서 어떻게 찾을 수 있습니까? 또한 1 줄을 바꿀 때 컴파일하는 데 1 시간을 기다리는 것을 원하지 않습니다. – drescherjm

+0

'# include' 전 처리기 명령을 사용하면 소스는 사용자에게 많은 파일에 있지만 컴파일러에 하나의 파일로 나타납니다. –

+0

컴파일 시간이 불필요하게 오래 걸릴 수 있습니다. – drescherjm

답변

5

이와 같이 별도의 컴파일 단위로 컴파일 속도가 빨라집니다. auxilliary.cpp을 변경하면 컴파일러는 모든 내용을 다시 컴파일하지 않고 auxilliary.o 만 다시 만들어야합니다. 이것은 프로젝트가 커질수록 특히 중요합니다.

0

나는 수사학적인 질문으로 이것을 대답 할 수 있습니다 : 하나의 큰 함수 대신 많은 함수를 작성하는 이유는 무엇입니까?

동일한 논리가 링크 수준에 적용됩니다. 당신이 큰 바이너리를 원하는 경우

0

당신은 정적 라이브러리를 구축 할 필요가 있지만, 하나 개의 번역 단위에서 개체 코드가 아닙니다, 그러나 많은에서.

이제 당신이 묻는 것이 합리적인지를 고려해보십시오. 하나의 .o 파일을 작성하는 경우, 빌드를 진행하면서 각 cpp의 컴파일 결과를 병합해야합니다. 여러 번 연결하는 데 드는 비용. 또한 하나의 변환 단위를 변경하려면 컴파일러가 대형 오브젝트 파일의 어떤 심볼을이 변환 단위의 원래 버전에서 가져온 것인지를 알아 내고 객체에서 제거한 다음 다시 작성한 후 새 객체를 추가해야합니다.