programing

Makefile과 CMake를 사용한 코드 컴파일 간의 차이점

prostudy 2022. 6. 6. 10:33
반응형

Makefile과 CMake를 사용한 코드 컴파일 간의 차이점

C/C++로 코드화하고 (GNU) Makefile을 사용하여 코드를 컴파일합니다.CMake도 같은 방법으로 Make File을 얻을 수 있습니다.그러나 Makefile과 CMake를 사용하여 코드를 컴파일하는 것의 차이점은 무엇입니까?

Make(또는 Makefile)는 빌드 시스템입니다.이 시스템은 컴파일러 및 기타 빌드 도구를 구동하여 코드를 빌드합니다.

CMake는 빌드 시스템의 생성자입니다.Makefiles, Ninja 빌드 파일, KDEvelop 또는 Xcode 프로젝트, Visual Studio 솔루션 등을 만들 수 있습니다.같은 시작점부터 같은 CMakeLists.txt 파일.따라서 플랫폼에 의존하지 않는 프로젝트가 있는 경우 CMake를 사용하여 빌드 시스템에 의존하지 않도록 할 수도 있습니다.

Visual Studio 개발자와 Unix 개발자가 GNU Make에 대해 선서하고 있다면 CMake는 (하나의) 방법일 것입니다.

프로젝트가 멀티플랫폼이거나 널리 사용되도록 하려면 CMake(또는 다른 빌드 시스템 생성기)를 사용하는 것이 좋습니다.CMake 자체는 의존관계 검출, 라이브러리 인터페이스 관리, CTest, CDash 및 CPack과의 통합 등의 뛰어난 기능도 제공합니다.

빌드 시스템 생성기를 사용하면 미래에 대비할 수 있습니다.현재 GNU-Make-only가 되어도 나중에 다른 플랫폼(Windows 또는 임베디드 기기 등)으로 확장하거나 IDE를 사용하고 싶은 경우에는 어떻게 해야 할까요?

CMake가 "빌드 제너레이터"라는 문장은 일반적인 오해입니다.

기술적으로 잘못된 것은 아닙니다.그것은 단지 어떻게 동작하는지에 대한 설명일 뿐이지, 어떻게 동작하는지는 설명하지 않습니다.

질문의 맥락에서는, C/C++ 파일 다발을 2진수로 변환하는 것과 같은 작업을 실시합니다.

그렇다면 진짜 차이점은 무엇일까요?

  • CMake의 약점입니다.C++ 컴파일용으로 되어 있어 빌드 코드를 훨씬 적게 작성할 수 있지만 범용 빌드에도 사용할 수 있습니다. makeC/C++ 룰도 몇 가지 내장되어 있습니다만, 아무리 생각해도 소용이 없습니다.

  • CMake빌드를 는 2단계 빌드 는 2단계입니다.이것에 의해, 로 레벨의 빌드 스크립트가 생성됩니다.ninja ★★★★★★★★★★★★★★★★★」make에 보통 쌓여 있는 모든 셸 Makefile생성 단계에서만 실행됩니다.따라서,CMake빌드 속도가 훨씬 빨라집니다.

  • 의 문법CMake외부 의 서포트는, 메이커의 서포트보다 훨씬 간단합니다.

  • 한번만make인공물을 만들지만 어떻게 만들어졌는지 잊어버려요어떤 소스로부터 구축되었는지, 어떤 컴파일러가 플래그를 표시하는지. CMake추적하고,make당신에게 맡기세요.이전 버전 이후 라이브러리 소스 중 하나가 제거된 경우Makefile,make리빌드되지 않습니다.

  • 현대의CMake(버전 3.something부터 시작)는 "displaces" 간의 종속성 측면에서 작동합니다.타깃은 여전히 단일 출력 파일이지만 트랜시티브("public"/"interface") 종속성을 가질 수 있습니다.이러한 전이 종속성은 종속 패키지에 노출되거나 종속 패키지에 숨겨질 수 있습니다. CMake에서 디렉토리를 관리합니다.와 함께make파일별, 디렉토리 관리 등의 수준에 머무르게 됩니다.

코드화할 수 있어요make중간 파일을 이용해서 마지막 두 개의 공백을 메우지만, 당신 혼자 할 수 있어요. make에는 튜링 완전 언어(두 개, 때로는 세 까지)가 포함되어 있습니다.첫 번째 두 개는 끔찍하고 실질적으로 Guile은 사용되지 않습니다.

솔직히 이런 게 있어요.CMake그리고.make공통점을 가지고 있습니다. 그들의 언어는 꽤 형편없죠.생각나는 것은 다음과 같습니다.

  • 사용자 정의 유형은 없습니다.
  • CMake에는 문자열, 목록 및 속성이 있는 타겟의 3가지 데이터 유형이 있습니다. make1개의 문자열이 있습니다.
  • 일반적으로 전역 변수를 설정하여 인수를 함수에 전달합니다.
    • 이것은 현대의 CMake에서 부분적으로 다루어지고 있습니다.대상의 속성을 설정할 수 있습니다.set_property(TARGET helloworld APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}");
  • 정의되지 않은 변수를 참조하면 기본적으로는 무시됩니다.

언급URL : https://stackoverflow.com/questions/25789644/difference-between-using-makefile-and-cmake-to-compile-the-code

반응형