私はarm-linux-androideabi-g++
コンパイラを使用しています。単純な "Hello、World!"をコンパイルしようとしたときそれがうまくコンパイルするプログラム。そのコードに簡単な例外処理を追加してテストすると(-fexceptions
を追加した後でも)デフォルトで無効になっていると思います。
これはAndroidデバイス用です、そして私はndk-build
ではなくCMakeを使いたいだけです。
例えば - 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")
追加する方法はいくつかあります。
最も簡単なもの(クリーンではないが、簡単で便利で、コンパイルフラグに対してのみ機能
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}")
ターゲットプロパティを使用する。 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 ( - 私の便利なCMakeマクロのセット)の ucm_add_flags と ucm_add_linker_flags マクロをチェックアウトしてください - それらは追加のコンパイラ/リンカフラグを扱います。