코드를 컴파일하기 위해 Makefile과 CMake를 사용하는 것의 차이점
C / C ++에서 코드를 작성하고 (GNU) Makefile을 사용하여 코드를 컴파일합니다. CMake와 동일한 작업을 수행하고 MakeFile을 얻을 수 있습니다. 그러나 Makefile과 CMake를 사용하여 코드를 컴파일하는 것의 차이점은 무엇입니까?
Make (또는 Makefile)는 빌드 시스템입니다. 컴파일러와 기타 빌드 도구를 사용하여 코드를 빌드합니다.
CMake는 빌드 시스템의 생성기입니다. Makefile, Ninja 빌드 파일, KDEvelop 또는 XCode 프로젝트, Visual Studio 솔루션을 생성 할 수 있습니다. 동일한 시작 지점에서 동일한 CMakeLists.txt 파일. 따라서 플랫폼 독립적 인 프로젝트를 가지고 있다면 CMake는 시스템 독립적 인 빌드를 만드는 방법입니다.
GNU Make가 맹세하는 Visual Studio 및 Unix 개발자에 익숙한 Windows 개발자가있는 경우 CMake를 사용하는 것이 좋습니다.
프로젝트를 다중 플랫폼 또는 광범위하게 사용할 수 있으려면 항상 CMake (또는 다른 빌드 시스템 생성기이지만 CMake가 개인적으로 선호 됨)를 사용하는 것이 좋습니다. CMake 자체는 종속성 감지, 라이브러리 인터페이스 관리 또는 CTest, CDash 및 CPack과의 통합과 같은 멋진 기능도 제공합니다.
빌드 시스템 생성기를 사용하면 프로젝트의 미래를 더욱 확실하게 할 수 있습니다. GNU-Make 만 사용하더라도 나중에 다른 플랫폼 (Windows 또는 내장 된 플랫폼)으로 확장하거나 IDE를 사용하려는 경우 어떻게해야합니까?
CMake가 "빌드 생성기"라는 말은 일반적인 오해입니다.
기술적으로 잘못된 것은 아닙니다. 작동 방식 만 설명하지만 작동 방식은 설명하지 않습니다.
질문의 맥락에서 그들은 똑같은 일을합니다 : 많은 C / C ++ 파일을 가져 와서 바이너리로 바꿉니다.
그렇다면 실제 차이점은 무엇입니까?
CMake는 훨씬 더 높은 수준입니다. 빌드 코드를 훨씬 적게 작성하지만 범용 빌드에도 사용할 수있는 C ++를 컴파일하도록 조정되었습니다.
make내장 C / C ++ 규칙도 있지만 대부분 쓸모가 없습니다.CMake두 단계의 빌드를 수행합니다 그것의 낮은 수준의 빌드 스크립트를 생성ninja하거나make다른 많은 발전기 나, 그리고 당신은 그것을 실행합니다. 일반적으로 쌓이는 모든 쉘 스크립트 조각Makefile은 생성 단계에서만 실행됩니다. 따라서CMake빌드 속도가 훨씬 빨라질 수 있습니다.의 문법은 make의 것보다
CMake외부 도구를 지원하기가 훨씬 쉽습니다 .make아티팩트를 빌드 하면 빌드 된 방식을 잊어 버립니다. 어떤 소스에서 어떤 컴파일러 플래그를 만들었습니까?CMake그것을 추적하고make당신에게 맡깁니다. 라이브러리 소스 중 하나는 이전 버전 이후 제거 된 경우Makefile,make그것을 다시하지 않을 것이다.최신
CMake(버전 3.something으로 시작)은 "대상"간의 종속성 측면에서 작동합니다. 대상은 여전히 단일 출력 파일 (슬프게도)이지만 전 이적 (CMake 용어에서 "공개"/ "인터페이스") 종속성을 가질 수 있습니다. 이러한 전이 종속성은 종속 패키지에 노출되거나 종속 패키지에서 숨겨 질 수 있습니다.CMake디렉토리도 관리합니다. 를 사용하면make파일 별 및 디렉토리 별 관리 수준을 유지할 수 있습니다.
make플래그 파일을 사용하여 마지막 두 틈을 막을 수있는 코드를 작성할 수는 있지만 혼자 있습니다. make포함 않습니다 튜링 완전한 언어 (심지어이, 때로는 세 계산 계략을 ), 그들 모두 끔찍하다.
솔직히 말해서, 이것은 무엇 CMake과 make그들의 언어는 꽤 끔찍한 - 공통점
- 그들은 유형이 없습니다.
- 배열이없고 공백으로 구분 된 문자열 만 있으므로 지옥에서 벗어날 수 있습니다.
- 일반적으로 전역 변수를 설정하여 인수를 함수에 전달합니다. (이것은 현대 CMake에서 다루어지고 있습니다-변수는 이제 네임 스페이스를 가질 수 있습니다. 대상은 속성의 네임 스페이스입니다)
- 정의되지 않은 변수를 참조하는 것은 기본적으로 자동 무시됩니다.
시작하기.
그러나 CMake훨씬 적은 수의 코드 줄을 작성하십시오.
'development' 카테고리의 다른 글
| 스택 크기가 50 배인 스레드를 기본값으로 만들 때 어떤 위험이 있습니까? (0) | 2020.04.17 |
|---|---|
| Java GUI 프레임 워크 (0) | 2020.04.17 |
| JavaScript에서 맵과 객체 (0) | 2020.04.16 |
| 파이썬 클래스에서 사용되는 'cls'변수는 무엇입니까? (0) | 2020.04.16 |
| PHP PDO 문은 테이블 또는 열 이름을 매개 변수로 사용할 수 있습니까? (0) | 2020.04.16 |