CMake 파일에 링커 또는 컴파일 플래그를 어떻게 추가합니까?
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 ++ 코드를 컴파일하고 있습니다.
Adding the flag to CMAKE_EXE_LINKER_FLAGS
is redundant.
You can also add linker flags to a specific target using the LINK_FLAGS
property:
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")
If you want to propagate this change to other targets, you can create a dummy target to link to.
Checkout the ucm_add_flags and ucm_add_linker_flags macros of ucm (my set of useful CMake macros) - they deal with appending compiler/linker flags.
참고URL : https://stackoverflow.com/questions/11783932/how-do-i-add-a-linker-or-compile-flag-in-a-cmake-file
'Programing' 카테고리의 다른 글
스칼라 목록에있는 아이템을 얻으시겠습니까? (0) | 2020.05.16 |
---|---|
여러 구분 기호와 함께 String.split () 사용 (0) | 2020.05.16 |
{ " (0) | 2020.05.16 |
자동 레이아웃이있는 UICollectionView 자체 크기 조정 셀 (0) | 2020.05.16 |
Visual Studio에서 설치된 TypeScript 버전을 어디에서 찾을 수 있습니까? (0) | 2020.05.16 |