web-dev-qa-db-ja.com

CMakeファイルにリンカフラグまたはコンパイルフラグを追加する方法

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

それでもエラーが表示されます。

174
solti

これらのフラグを追加したいとしましょう(それらを定数で宣言したほうが良いです)。

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-lgcov")

追加する方法はいくつかあります。

  1. 最も簡単なもの(クリーンではないが、簡単で便利で、コンパイルフラグに対してのみ機能

    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を使います。

205
Offirmo

CMakeの新しいバージョンでは、それぞれ target_compile_optionstarget_link_libraries を使って単一のターゲットに対してコンパイラフラグとリンカフラグを設定することができます(はい、後者もリンカオプションを設定します):

target_compile_options(first-test PRIVATE -fexceptions)

この方法の利点は、PUBLICPRIVATEによって、これに依存する他のターゲットへのオプションの伝播を制御できることです。

CMake 3.13では、意図をより明確にするリンカオプションを追加するために target_link_options を使用することもできます。

125
vitaut

CMAKE_CXX_FLAGSの代わりに変数CMAKE_C_FLAGSを設定してみてください。

set (CMAKE_CXX_FLAGS "-fexceptions")

変数CMAKE_C_FLAGSはCコンパイラにのみ影響しますが、C++コードをコンパイルしています。

CMAKE_EXE_LINKER_FLAGSにフラグを追加することは冗長です。

35
sakra

LINK_FLAGSプロパティを使用して、リンカフラグを特定のターゲットに追加することもできます。

set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

この変更を他のターゲットに伝播したい場合は、リンク先のダミーターゲットを作成できます。

1
kaveish

ucm ( - 私の便利なCMakeマクロのセット)の ucm_add_flagsucm_add_linker_flags マクロをチェックアウトしてください - それらは追加のコンパイラ/リンカフラグを扱います。

0
onqtam