CMake 파일에 링커 또는 컴파일 플래그를 어떻게 추가합니까?


220

arm-linux-androideabi-g++컴파일러를 사용하고 있습니다. 간단한 "Hello, World!"를 컴파일하려고 할 때 프로그램이 잘 컴파일됩니다. 해당 코드에 간단한 예외 처리를 추가하여 테스트 할 때도 작동합니다 ( -fexceptions.. 추가 후 기본적으로 비활성화되어있는 것 같습니다).

이것은 Android 기기 용이며 CMake 만 사용하고 싶습니다 ndk-build.

예를 들어- first.cpp

#include <iostream>

using namespace std;

int main()
{
   try
   {
   }
   catch (...)
   {
   }
   return 0;
}

./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions

문제없이 작동합니다 ...

문제 ... CMake 파일로 파일을 컴파일하려고합니다.

-fexceptions플래그 로 추가하고 싶습니다 . 나는 함께 노력했다

set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )

set ( CMAKE_C_FLAGS "fexceptions")

여전히 오류가 표시됩니다.


지금 나는 같은 문제를 겪고 있으며 다른 일을 시도하고 있습니다. 조금만 걸어 답변을 게시합니다. 컴파일 플래그의 경우 부정확하지만 쉬운 방법이 있습니다. add_definitions ( "-truc")
Offirmo

이 질문에 대한 최신 토론 (특히 CMake 3.x 이상을 사용하는 경우) : CMake에서 일반 컴파일 플래그를 설정하는 최신 방법은 무엇입니까? .
ComicSansMS

당신이 구성을 목표로 원하는 링크 플래그 경우 RPATH는 다음 특정 살펴이 CMake RPATH 명령 gitlab.kitware.com/cmake/community/wikis/doc/cmake/...
가브리엘 Devillers

답변:


243

해당 플래그를 추가한다고 가정합니다 (상수로 선언하는 것이 더 낫습니다).

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

여러 가지 방법으로 추가 할 수 있습니다.

  1. 가장 쉬운 방법 (깨끗하지는 않지만 쉽고 편리하며 컴파일 플래그, C & C ++에만 한 번에 작동) :

    add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
  2. 해당 CMake 변수에 추가 :

    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
    SET(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
  3. 대상 속성 사용, cf. doc CMake 컴파일 플래그 대상 속성 이며 대상 이름을 알아야합니다.

    get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)
    if(TEMP STREQUAL "TEMP-NOTFOUND")
      SET(TEMP "") # Set to empty string
    else()
      SET(TEMP "${TEMP} ") # A space to cleanly separate from existing content
    endif()
    # Append our values
    SET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )
    set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )

지금은 방법 2를 사용합니다.


4
add_definitions ()가 부정한 이유는 무엇입니까?
leinaD_natipaC

14
@leinaD_natipaC : 공식 문서 는 다음과 같이 말합니다 : 이 명령은 모든 플래그를 추가하는 데 사용될 수 있지만 전 처리기 정의를 추가하기위한 것 입니다. 나는 그것이 이유라고 생각합니다.
Benoit Blanchon

이것은 매우 오래된 스타일의 CMAKE를 보여주는 승인 된 답변이지만, 컴파일 시간 매개 변수와 관련하여 새로운 CMAKE 코드를 어떻게 구성해야하는지 @vitaut의 답변을 참조하십시오
Harald Scheirich

1
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")보다 짧고 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
피의

165

CMake의 최신 버전에서는 하나와 대상에 대해 컴파일러 및 링커 플래그를 설정할 수 있습니다 target_compile_optionstarget_link_libraries각각 (예, 옵션 링커 후자 세트도) :

target_compile_options(first-test PRIVATE -fexceptions)

이 방법의 장점은이를 통해 하나에 의존하는 다른 대상에 옵션의 전파를 제어 할 수 있다는 것입니다 PUBLICPRIVATE.

CMake 3.13부터는 target_link_options의도를보다 명확하게하는 링커 옵션을 추가 하는 데 사용할 수도 있습니다 .


2
나는 그것을 사용하려고 시도했지만 target_compile_options(main_static PRIVATE --static)작동하지 않는 것 같습니다.
Paweł Szczur

2
-static아마도 컴파일러 옵션이 아닌 링커 일 것입니다. 로 전달해보십시오 target_link_libraries.
vitaut

9
아, target_link_libraries나는 문서의 그 부분을 놓쳤다 : " 주어진 대상을 연결할 때 사용할 라이브러리 또는 플래그 를 지정하십시오 .". 감사.
Paweł Szczur

3
최근에 추가 된 CMake 3.13에서는 target_link_options링커 플래그를보다 명확 하게 지정할 수 있습니다. 당신은 사용하지 않아야 target_link_libraries향후 링커 플래그과 사용하는 target_link_options대신.
ComicSansMS


46

CMAKE_CXX_FLAGS대신 변수 를 설정하십시오 CMAKE_C_FLAGS.

set (CMAKE_CXX_FLAGS "-fexceptions")

변수 CMAKE_C_FLAGS는 C 컴파일러에만 영향을 주지만 C ++ 코드를 컴파일하고 있습니다.

플래그를 추가하는 CMAKE_EXE_LINKER_FLAGS것은 중복됩니다.


나는 그것을 시도했지만 여전히 오류가 발생합니다. 컴파일러 플래그를 지정하는 유일한 방법은 set (CMAKE_CXX_FLAGS "-fexceptions")입니다.
solti

3
문제를 해결했지만 좋지 않은 방법으로 문제를 해결했습니다 .. 명령 줄에서 -DCMAKE_CXX_FLAGS = "-fexceptions"을 만들었습니다. 어떤 이유로 cmake가 .cmake 파일에서 플래그를 읽지 않습니다. :( .. 답변 주셔서 감사합니다. ..
solti

8
-DCMAKE_CXX_FLAGS = "-fexceptions"는 사이 공간 = 및 "가되어서는 안된다
evandrix

"무슨 이유로 cmake는 .cmake 파일에서 플래그를 읽지 않습니다." 기존 캐시를 지우십시오. cmake를 다시하기 전에 빌드 디렉토리에서 모든 것을 삭제하면됩니다.
zaizen

1

LINK_FLAGS속성을 사용하여 특정 대상에 링커 플래그를 추가 할 수도 있습니다 .

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

이 변경 사항을 다른 대상으로 전파하려는 경우 연결할 더미 대상을 만들 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.