수색…


소개

기본 CMake 변수의 단순성은 전체 변수 구문의 복잡성에 달려 있습니다. 이 페이지는 예제와 함께 다양한 변수 사례를 문서화하고 피할 수있는 함정을 지적합니다.

통사론

  • set (variable_name 값 [CACHE 유형 설명 [FORCE]])

비고

변수 이름은 대소 문자를 구분합니다. 이들의 값은 string 유형입니다. 변수의 값은 다음을 통해 참조됩니다.

${variable_name}

따옴표로 묶인 인수 내에서 평가됩니다.

"${variable_name}/directory"

캐시 된 (전역) 변수

set(my_global_string "a string value"
    CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
    CACHE BOOL "a description on the boolean cache entry")

CMake가 각 라인을 처리 할 때 (예 : CMake가 다시 실행될 때) 캐시 된 변수가 캐시에 이미 정의되어있는 경우 변경되지 않습니다. 기본값을 덮어 FORCE 려면 FORCE 를 마지막 인수로 추가하십시오.

set(my_global_overwritten_string "foo"
    CACHE STRING "this is overwritten each time CMake is run" FORCE)

지역 변수

set(my_variable "the value is a string")

기본적으로 로컬 변수는 add_subdirectory 명령을 통해 추가 된 현재 디렉토리 및 모든 하위 디렉토리에서만 정의됩니다.

변수의 범위를 확장하려면 두 가지 가능성이 있습니다.

  1. CACHE it을 사용하면 전 세계에서 사용할 수 있습니다.

  2. 상위 범위에서 사용할 수 있도록 PARENT_SCOPE 사용 PARENT_SCOPE . 상위 범위는 상위 디렉터리의 CMakeLists.txt 파일이거나 현재 함수의 호출자입니다.

    기술적으로 상위 디렉토리는 add_subdirectory 명령을 통해 현재 파일을 포함하는 CMakeLists.txt 파일입니다.

문자열 및 목록

CMake가리스트와 일반 문자열을 구별하는 방법을 아는 것이 중요합니다. 당신이 쓸 때 :

set(VAR "ab c")

"ab c" 있는 문자열 을 만듭니다. 그러나 따옴표없이이 줄을 쓸 때 :

set(VAR abc)

대신 "a" , "b""c" 의 세 항목 목록 을 만듭니다.

비 목록 변수는 사실 (너무 단일 요소) 목록입니다.

목록은 list() 명령으로 조작 할 수 있습니다.이 명령은 list() 연결하고 검색하며 임의의 요소에 액세스하는 등의 작업 을 수행합니다 (list () 문서 ).

다소 혼란 스럽지만 목록문자열 이기도 합니다 . 라인

set(VAR abc)

~에 해당합니다.

set(VAR "a;b;c")

따라서 목록을 연결하려면 set() 명령을 사용할 수도 있습니다.

set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"

변수 및 전역 변수 캐시

주로 "일반 변수"를 사용합니다 .

set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})

그러나 CMake는 또한 전역 캐싱 변수 ( CMakeCache.txtCMakeCache.txt )를 CMakeCache.txt 있습니다. 그리고 같은 이름의 일반 변수와 캐시 된 변수가 현재 범위에 존재하면 일반 변수는 캐시 된 변수를 숨 깁니다.

cmake_minimum_required(VERSION 2.4)
project(VariablesTest)

set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")

set(VAR "NORMAL")
message("VAR = ${VAR}")

set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")

최초 실행 결과

VAR = CACHED-init
VAR = NORMAL
VAR = CACHED

두 번째 실행의 출력

VAR = CACHED
VAR = NORMAL
VAR = CACHED

참고 : FORCE 옵션은 현재 범위에서 일반 변수를 설정 해제 / 제거합니다.

캐시 된 변수의 사용 사례

일반적으로 두 가지 유스 케이스가 있습니다 (전역 변수를 오용하지 마십시오).

  1. 코드의 값은 프로젝트 사용자가 cmakegui , ccmake 또는 cmake -D ... 옵션을 사용하여 수정할 수 있어야합니다.

    CMakeLists.txt / MyToolchain.cmake

    set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
    

    명령 행

    $ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
    

    이것은 캐시에서이 값을 미리 설정하고 위의 행은이를 수정하지 않습니다.

    CMake GUI

    여기에 이미지 설명을 입력하십시오.

    GUI에서 사용자는 먼저 구성 프로세스를 시작한 다음 캐시 된 값을 수정하고 빌드 환경 생성을 시작하면서 완료 할 수 있습니다.

  1. 또한 CMake는 캐시 검색 / 테스트 / 컴파일러 식별 결과를 처리합니다 (따라서 구성 / 생성 단계를 다시 실행할 때마다 다시 수행 할 필요가 없습니다)

    find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
    

    여기서 LIB_A_PATH 는 캐시 된 변수로 작성됩니다.

gake를 사용하기위한 CMake에 프로파일 링 플래그 추가하기

일련의 이벤트는 다음과 같이 작동합니다.

  1. -pg 옵션을 사용하여 코드 컴파일
  2. -pg 옵션으로 코드 링크하기
  3. 프로그램 실행
  4. 프로그램이 gmon.out 파일을 생성합니다.
  5. gprof 프로그램 실행

프로파일 링 플래그를 추가하려면, CMakeLists.txt에 추가해야합니다 :

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")

컴파일 및 링크 할 플래그를 추가하고 프로그램을 실행 한 후에 사용해야합니다.

gprof ./my_exe

다음과 같은 오류가 발생할 경우 :

gmon.out: No such file or directory

이는 컴파일이 프로파일 링 정보를 올바르게 추가하지 못했음을 의미합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow