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")
여러 가지 방법으로 추가 할 수 있습니다.
-
가장 쉬운 방법 (깨끗하지는 않지만 쉽고 편리하며 컴파일 플래그, C & C ++에만 한 번에 작동) :
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
-
해당 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}")
-
대상 속성 사용, 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_options
및 target_link_libraries
각각 (예, 옵션 링커 후자 세트도) :
target_compile_options(first-test PRIVATE -fexceptions)
이 방법의 장점은이를 통해 하나에 의존하는 다른 대상에 옵션의 전파를 제어 할 수 있다는 것입니다 PUBLIC
및 PRIVATE
.
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}")
이 변경 사항을 다른 대상으로 전파하려는 경우 연결할 더미 대상을 만들 수 있습니다.
답변
ucm 의 ucm_add_flags 및 ucm_add_linker_flags 매크로 (유용한 CMake 매크로 세트)를 확인하십시오. 이들은 컴파일러 / 링커 플래그 추가를 처리합니다.