CMake를 통해 전 처리기 매크로를 정의 하시겠습니까?


283

CMake를 통해 전 처리기 변수를 어떻게 정의합니까?

동등한 코드는입니다 #define foo.

답변:


382

오랫동안 CMake는 add_definitions이러한 목적으로 명령을 받았습니다. 그러나 최근이 명령은보다 세분화 된 접근 방식 (컴파일 정의에 대한 별도의 명령, 디렉토리 및 컴파일러 옵션 포함)으로 대체되었습니다.

새로운 add_compile_definitions 사용 예 :

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)

또는:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

이것에 대한 좋은 부분은 CMake가 가지고있는 초라한 속임수를 우회한다는 것입니다. add_definitions . CMake는 초라한 시스템이지만 마침내 정신을 잃고 있습니다.

컴파일러 플래그에 사용할 명령에 대한 자세한 설명은 https://cmake.org/cmake/help/latest/command/add_definitions.html을 참조 하십시오.

마찬가지로 Jim Hunziker의 답변에 설명 된대로 대상별로이 작업을 수행 할 수 있습니다.


4
링크 된 페이지에서 : "이 명령은 다른 방법으로 대체되었습니다. add_compile_definitions ()를 사용하여 전 처리기 정의를 추가하십시오." 이 답변에 수정이 필요한가요?
M.Herzkamp

9
cmake 3.10.2에서는을 add_compile_definitions던집니다 CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".. add_compile_options(-D <your-def>)대신 사용해야 했다.
code_dredd

2
@mannyglover 그렇게 생각하지는 않지만 -D로 컴파일러 플래그를 설정할 수 있습니다 cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(테스트되지 않음)
ypnos

1
정말 새롭습니다 ... 사실 더 현대적인 CMake (> 3.11)에 있습니다. 명령이 언제 도입되었는지 알기 어려운 고통.
Sandburg

1
@Sandburg 마지막 문서에 대한 링크를 열고 https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions페이지가 사라질 때까지 버전 번호를 변경하십시오. 그것은 아직 존재하지 않는 버전입니다. 다음 단계에서는 Whats new섹션으로 이동하여 새 명령 또는 기능을 찾을 수 있습니다. 그렇게 어렵지 않습니다.
Andry

245

특정 대상에 대해이를 수행하려면 다음을 수행하십시오.

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

빌드중인 대상이 둘 이상 있고 모두 동일한 플래그를 사용하지 않으려면이 작업을 수행해야합니다. target_compile_definitions 에 대한 공식 문서도 참조하십시오 .


1
@JimHunziker 어떻게 target_compile_definitions(my_target PRIVATE FOO=1)다른가 set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)?
John Strood

1
@JohnStrood 차이점은 범위 수준에 있습니다. target_compile_definitionsWHOLE 실행 파일 / 라이브러리의 값을 설정합니다. 여기서 'set_source_files_properties`는 지정된 파일의 값만 설정합니다. Latter 명령을 사용하면 파일을 다른 언어로 컴파일 할 수 있습니다. 즉 : set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c. 참고 것을 -x objective-c여기 GCC / 연타에 플래그 고유의 것입니다.
Julian Kirsch

20

이 페이지에서 제안 된 다른 솔루션은 일부 버전의 Cmake <3.3.2 유용합니다 . 여기에 내가 사용중인 버전에 대한 해결책 (즉, 3.3.2)이 있습니다. 사용하여 Cmake의 버전을 확인하고 $ cmake --version필요에 맞는 솔루션을 선택하십시오. cmake 문서는 공식 페이지에서 볼 수 있습니다.

CMake 버전 3.3.2에서는

#define foo

나는 사용해야했다 :

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

그리고 이와 같은 전 처리기 매크로 정의를 가지려면 :

#define foo=5

줄이 그렇게 수정되었습니다.

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

4
문서 ,이 솔루션은 실제로 나이가 더 많은 구식 방법입니다. 다른 답변은 더 현대적인 솔루션을 제공합니다.
squareskittles

2
대답을 쓸 때 다른 해결책을 시도했지만 그중 아무것도 작동하지 않았습니다.
Leos313

@ squareskittles, 다른 답변의 솔루션이 올바르게 작동하지 않는 이유는 무엇입니까? CMake는 내가 시도하면 오류를

1
답변에 표시된대로 CMake 3.3.2를 사용하는 경우 add_definitions()또는 을 사용해야 target_compile_definitions()합니다. add_compile_definitions()CMake 3.12까지 최신 명령 이 추가되지 않았습니다. @ Leos313
squareskittles

1
@squareskittles, 나는 대답을 업데이트하고, 내가 mounth 전에 쓴 것을 다시 씁니다. 이것을 지적 해 주셔서 감사합니다
Leos313
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.