2013-12-09 3 views
1

테스트 버킷에 수백 개의 .c 소스 프로그램이있는 그룹에서 일합니다. .c 프로그램은 상당히 작으며 모두 동일한 .h 헤더 파일을 포함합니다. 이러한 .h 파일은 상당히 큽니다.많은 .c 소스 프로그램에서 사용하는 .h 헤더 파일을 컴파일하고 연결하십시오.

우리는 테스트를 위해 테스트 프로그램을 링크 할 새 라이브러리 파일을 얻을 때마다 스크립트를 실행하여 테스트 용 버킷을 다시 컴파일하고 실행합니다. 문제는 특히 환경이 가상 인 경우 컴파일이 상당히 오래 걸린다는 것입니다.

.h 헤더 파일을 한 번 컴파일하고 별도의 오브젝트 파일에 넣은 다음 그 많은 .c 소스 파일을 해당 오브젝트 파일에 링크하는 방법이 있습니까? 나는 이것이 컴파일 시간을 단축시킬 것이라고 생각한다. .c 소스 프로그램에서 모든 #include를 변경/제거하고자합니다.

컴파일 시간 단축에 대한 제안 사항에 크게 감사드립니다.

또한 스크립트는 makefile PER .c 소스 테스트 프로그램을 실행한다고 말해야합니다. makefile은 현재 디렉토리의 모든 프로그램을 컴파일하라는 지시를받지 않습니다. 각 테스트 프로그램은 자체 실행 파일로 컴파일됩니다.

+2

헤더 파일이 컴파일되지 않습니다. 그들은 #c 파일에 포함되어 컴파일됩니다. 대부분의 경우 헤더 파일에는 .c 파일에서 함수, 구조체, 데이터 유형 등을 참조 할 수있는 선언이 포함되어 있습니다. –

+0

@master_latch 아쉽게도 헤더 파일을 만든 프로그래머는 실제로 수천 줄의 구현 코드를 작성했습니다. 그들은 선언 용도로 사용하지 않았습니다. .h 파일의 코드는 모든 .c 파일 테스트 프로그램에서 사용되는 공유 코드입니다. 따라서 "미리 컴파일 된 헤더"가 해결책이 될 수 있습니다. 또는 .h 헤더 파일을 포함하는 더미 .c 파일을 만들고이 파일에서 개체를 만든 다음 모든 .c 파일이 그 파일에 링크됩니까? – slowmo

+0

오, 알았어요. 미리 컴파일 된 헤더가 무엇인지는 몰랐습니다.하지만 이제는 MSVS에서 옵션으로 보았던 것을 기억합니다. 누군가 당신의 질문에 대답 할 수있어서 기뻤습니다! –

답변

2

미리 컴파일 된 헤더 기능을 사용할 수 있습니다. http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

+0

하이퍼 링크의 첫 번째 문장을 읽습니다. 이것은 내가 필요로하는 정확하게 것 같다! 고맙습니다. – slowmo

+0

업데이트 만. 나는 용 타이거가 한 말을 끝냈다. 컴파일 시간이 982 초에서 287 초로 변경되었습니다. 3 배 조금 빨리! – slowmo

1

컴파일 속도를 높이기위한 추가 제안 사항을 요청했습니다.

편도는 ccache 일 수 있습니다. 기본적으로 ccache는 지금까지 컴파일 된 객체 파일의 캐시를 유지하고 동일한 소스 파일이 다시 컴파일된다는 것을 인식하면 (다시 반복해서 다시 컴파일하는 대신) 반환합니다. ccache 설치가

  1. 만큼 간단해야
  2. 접두사 ccache
+0

감사합니다. 전에이 프로그램을 사용 해본 적이 있습니까? 테스트 프로그램의 소스 코드가 같고 연결하려는 라이브러리 파일이 다르면 여전히 다시 컴파일해야합니까? 때로는 소스 코드가 변경되지 않아 다른 라이브러리 파일을 테스트해야 할 때도 있습니다. – slowmo

+0

기본적으로 코드에 변경 사항 (.c 또는 .h)이있는 경우에만 다시 컴파일됩니다. 다른 .so에 대해서만 동일한 .o를 링크하면 캐시에있는 것과 동일한 .o를 다시 사용합니다. –

1

와 GCC/CC/g ++ 명령하여 헤더를 다시 작성을 사용

. 모든 정의를 벗기고 헤더에 남겨 둡니다. 모든 구현을 제거하고 새로운 .c를 넣습니다. 라이브러리로 컴파일하십시오. 솔루션과 연결하십시오. 런타임 시스템에 라이브러리를 배포하십시오.

+0

내가 할 수 있으면 좋겠다. 회귀 양동이의 제작자는 지출 한 시간의 이익이 그것을 정당화하지 못하기 때문에이를 허용하지 않습니다. 귀하의 제안은 확실히 그것을하는 올바른 방법입니다. 감사! – slowmo

+0

@ user3080362 와우, 이득은 확실히 노력을 정당화. 제작자가 자신의 행위 방식이 잘못되었다는 것을 증명하기를 원하지 않는 것으로 드러났습니다 ... :) 제 제안은 어쨌든 해봅시다. 코드를 쉽게 재사용하기 시작하면 머리를 묻어 부끄러워해야합니다. 게다가, 헤더에 관해서는 헤더가 내용 선언만을위한 것이므로 구현이 없어야합니다. 너무 많은 구현을하면 학대와 게으름이 있습니다. – Xephon

0

라이브러리가 일반적으로 작동하는 방식은 프로젝트에서 사용할 헤더 파일 (.h)을 제공하면서 오브젝트 파일 (Linux 시스템에서는 .so)에서 미리 컴파일 된 코드를 사용하는 것입니다.

컴파일 할 때 #include <library.h> 지시문은 해당 헤더를 찾아 내용이 컴파일되는 소스 파일에 붙여 넣습니다. 그런 다음 소스 파일이 컴파일되면 미리 컴파일 된 오브젝트 파일에 링크됩니다. 그렇게하면 매번 소스에서 컴파일 할 필요없이 방대한 프로젝트에 라이브러리를 포함시킬 수 있습니다. 라이브러리에 링크 할 때 다시 컴파일해야하는 유일한 부분은 헤더에있는 (상대적으로) 적은 양의 코드인데, 기본적으로 라이브러리 기능과 변수를 소스 코드에 액세스 할 수있게합니다.

이 모든 것은 컴파일 속도를 크게 높이려면 모든 .h 파일에서 모든 기능을 가져 와서 헤더에 함수 프로토 타입 만 남겨 두는 것이 가장 좋습니다. 별도의 .c 소스 파일에 모든 기능이 있으면 오브젝트 파일 (보통 -c 플래그)로 컴파일 할 수 있습니다. 그런 다음 일반적으로 사용하는 10 개의 헤더에 대해 새 프로그램을 컴파일해야 할 때마다 헤더를 제거한 다음 미리 컴파일 된 객체에 링크 할 수 있습니다..c 파일의 새 코드 만 헤더의 모든 코드 대신 컴파일해야하므로 프로세스가 훨씬 빨라야합니다.

관련 문제