[cmake] CMake를 사용하여 CFLAGS 및 CXXFLAGS 옵션 설정

Linux에서 실행되는 일부 코드를 디버깅하고 디버그 빌드 ( -O0 -ggdb) 가 필요합니다 . 그래서 다음 항목을 내 CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

컴파일을하려고 할 때 사용을 자세히 설정하고 다음 make VERBOSE=1
과 같이 출력을 관찰했습니다.

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2**
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

분명히 코드가 컴파일 "-g -O2"되고 이것은 내가 원하는 것이 아닙니다. 강제로 사용하려면 어떻게 "-O0 -ggdb"해야합니까?



답변

CMakeLists.txt 의 명령어 뒤에 플래그를 설정해야합니다 project.

또한 include(${QT_USE_FILE})또는을 호출하는 경우 추가 플래그를 추가하므로 Qt 명령 뒤에 add_definitions(${QT_DEFINITIONS})이러한 set명령을 포함해야 합니다. 그 경우 경우를, 당신은 어쩌면 그냥, Qt는 것들에 플래그를 추가 할 예로 변경 때문에

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")


답변

나를 위해 잘 작동하는 가장 쉬운 솔루션은 다음과 같습니다.

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMake는이를 모든 구성의 플래그에 추가합니다. CMake 캐시를 지우십시오.


답변

cmake C / CXX 기본 FLAGS를 변경해야합니다.

다음 중 CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE}
주요 항목 에 넣으십시오 CMakeLists.txt.

C 용

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

C ++의 경우

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

이것은 CMakeCache.txt에 정의 된 값을 재정의합니다.


답변

Unix 시스템에서 여러 프로젝트의 경우 이러한 행을 CMakeLists.txt에 추가했으며 기본 ( / usr / include ) 및 로컬 포함 ( / usr / local / include )이 분리 된 디렉토리로 이동 하기 때문에 성공적으로 컴파일되었습니다 .

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

C 및 C ++ 컴파일러 플래그에 대한 경로와 링커 플래그에 대한 올바른 디렉터리 경로를 포함하여 올바른 디렉터리를 추가합니다.

참고 : C ++ 컴파일러 (c ++)는 -L을 지원하지 않으므로 CMAKE_EXE_LINKER_FLAGS 를 사용해야 합니다.


답변