CMake ファイルにリンカーまたはコンパイル フラグを追加するにはどうすればいいですか? 質問する

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

まだエラーが表示されます。

ベストアンサー1


2012 年にこの回答が書かれて以来 CMake が進化したため、ここで提供される推奨事項の大部分は現在では廃止されているか推奨されなくなり、改善された代替手段が利用可能になっていることにご注意ください。


これらのフラグを追加したいとします (定数で宣言した方がよいでしょう):

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. ターゲットプロパティの使用については、ドキュメントを参照してください。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を使っています。

おすすめ記事