CMake 파일에 링커 또는 컴파일 플래그를 어떻게 추가합니까? namespace std; int main() {

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")

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



답변

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

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를 사용합니다.


답변

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

target_compile_options(first-test PRIVATE -fexceptions)

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

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


답변

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

set (CMAKE_CXX_FLAGS "-fexceptions")

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

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


답변

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

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

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


답변

ucmucm_add_flagsucm_add_linker_flags 매크로 (유용한 CMake 매크로 세트)를 확인하십시오. 이들은 컴파일러 / 링커 플래그 추가를 처리합니다.