문제

Visual C++를 사용한 대부분의 개발 작업에는 부분 빌드를 사용하고 있습니다.F7을 누르면 변경된 C++ 파일만 해당 종속성이 다시 빌드되고 증분 링크가 이어집니다.버전을 테스트하기 전에 전체 재구축을 주의 깊게 수행합니다. 현재 프로젝트에서는 약 45분이 소요됩니다.나는 이 조치를 옹호하는 많은 게시물과 기사를 보았지만 이것이 필요한지 궁금합니다. 그렇다면 왜 그렇습니까?제공된 EXE 또는 관련 PDB(테스트에도 사용)에 영향을 줍니까?소프트웨어 기능이 테스트 관점과 다른가요?

릴리스 빌드의 경우 VS2005, 증분 컴파일 및 링크, 미리 컴파일된 헤더를 사용하고 있습니다.

도움이 되었습니까?

해결책

모든 사람 이이 사용 패턴을 발견하지 못했습니까? 이상한 빌드 오류가 발생하고 조사하기 전에 완전히 재건을하고 문제가 사라집니다.

이것은 그 자체로 나에게 릴리스 전에 완전히 재건할만한 충분한 이유 인 것 같습니다.

테스트에 문제없이 완료되는 점진적인 빌드를 기꺼이 돌릴 수 있는지 여부는 맛의 문제라고 생각합니다.

다른 팁

부분 빌드 시스템은 빌드 결과에 대해 소스 파일의 파일 날짜를 확인하여 작동합니다. 따라서 소스 컨트롤에서 이전 파일을 복원하면 끊어 질 수 있습니다. 이전 파일은 빌드 제품보다 일찍 수정 된 날짜를 가지므로 제품이 재건되지 않습니다. 이러한 오류로부터 보호하려면 최종 빌드 인 경우 완전한 빌드를 수행해야합니다. 그래도 개발 중에는 증분 빌드가 훨씬 더 효율적입니다.

편집 : 물론 전체 재건을 수행하면 증분 빌드 시스템에서 가능한 버그에서 벗어날 수 있습니다.

기본적인 문제는 컴파일이 환경(명령줄 플래그, 사용 가능한 라이브러리 및 아마도 일부 Black Magic)에 따라 달라지므로 두 컴파일이 동일한 조건에서 수행되는 경우에만 동일한 결과를 갖게 된다는 것입니다.테스트 및 배포를 위해 환경이 최대한 제어되고 이상한 코드로 인해 이상한 동작이 발생하지 않는지 확인하려고 합니다.좋은 예는 시스템 라이브러리를 업데이트한 다음 파일의 절반을 다시 컴파일하는 것입니다. 절반은 여전히 ​​이전 코드를 사용하려고 시도하고 절반은 그렇지 않습니다.완벽한 세상에서는 오류가 즉시 발생하거나 문제가 발생하지 않을 수 있지만, 안타깝게도 때로는 그런 일이 발생하지 않는 경우도 있습니다.결과적으로 전체 재컴파일을 수행하면 시차를 둔 빌드 프로세스와 관련된 많은 문제를 피할 수 있습니다.

나는 확실히 그것을 추천 할 것이다. 큰 시각적 C ++ 솔루션으로 여러 차례 보았습니다. 종속성 검사기는 변경된 코드에 대한 종속성을 선택하지 못합니다. 이 변경 사항은 객체의 크기에 영향을 미치는 헤더 파일에있어서 매우 이상한 일이 시작될 수 있습니다. 2008 년 대 VS에서 의존성 검사기가 더 나아 졌다고 확신하지만 여전히 릴리스 빌드에 대해서는 신뢰하지 않을 것입니다.

점진적으로 연결된 바이너리를 배송하지 않는 가장 큰 이유는 일부 최적화가 비활성화되기 때문입니다. 링커는 함수간에 패딩을 남겨두고 (다음 증분 링크에서 더 쉽게 교체 할 수 있도록). 이것은 바이너리에 약간의 부풀게됩니다. 추가 점프가있을 수 있으며, 메모리 액세스 패턴을 변경하고 추가 페이징 및/또는 캐시 미스가 발생할 수 있습니다. 기존 버전의 기능은 호출되지 않더라도 실행 파일에 계속 상주 할 수 있습니다. 이것은 또한 이진 부풀어 오르고 성능이 느려집니다. 또한 점진적인 링크와 함께 링크 시간 코드 생성을 사용할 수 없으므로 더 많은 최적화를 놓치게됩니다.

테스터에게 디버그 빌드를 제공한다면 아마도 큰 문제가 아닐 것입니다. 그러나 릴리스 후보는 릴리스 모드로 처음부터 구축되어야하며, 바람직하게는 통제 된 환경이있는 전용 빌드 머신에서 구축해야합니다.

Visual Studio는 때때로 부분적 (증분) 빌드에 문제가 있으며 (대부분 링크 오류가 발생했습니다) 때때로 전체 재건을하는 것이 매우 유용합니다.

편집 시간이 긴 경우 두 가지 솔루션이 있습니다.

  1. 병렬 컴파일 도구를 사용하고 (가정 된) 멀티 코어 하드웨어를 활용하십시오.
  2. 빌드 머신을 사용하십시오. 내가 가장 많이 사용하는 것은 Cruisecontrol 설정이있는 별도의 빌드 머신입니다. 내가 테스트 팀에 제공하고 결국 고객에게 제공하는 "공식"릴리스는 항상 개발자의 환경이 아닌 빌드 머신에서 가져옵니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top