1. ホーム
  2. c++

[解決済み】CMakeファイルにリンカやコンパイルフラグを追加する方法は?

2022-04-16 13:44:13

質問

を使用しています。 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")

やはりエラーが表示されます。

どうすればいいですか?

注:この回答が書かれた後の 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. ターゲットプロパティの使用、参照: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の方法を使っています。