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


220

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

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


現在、私は同じ問題を抱えており、別のことを試みています。少しぶら下げて、回答を投稿します。コンパイルフラグには、不明瞭ですが簡単な方法があります:add_definitions( "-truc")
Offirmo

この質問に関する最新の議論について(特にCMake 3.x以降を使用している場合):CMakeで一般的なコンパイルフラグを設定するための最新の方法は何ですか?
ComicSansMS 2015

あなたが設定を目指したいリンクフラグ場合RPATHは、特定のを見てCMakeのRPATHコマンドgitlab.kitware.com/cmake/community/wikis/doc/cmake/...
ガブリエルDevillers

回答:


243

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

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. ターゲットプロパティを使用する場合は、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を使用しています。


4
add_definitions()が不潔なのはなぜですか?
leinaD_natipaC 2014年

14
@leinaD_natipaC:公式ドキュメントによると:このコマンドはフラグを追加するために使用できますが、プリプロセッサー定義を追加することを目的としています。それが理由だと思います。
Benoit Blanchon 2014年

これが受け入れ答えですが、これは本当に、非常に古いスタイルのCMAKEを示し、新しいCMAKEコードはコンパイル時パラメータに関して構造化されなければならない方法について@vitautで答えを参照してください
ハラルドScheirich

1
string(APPEND CMAKE_EXE_LINKER_FLAGS "new_value")短く、よりクリーンであるset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} new_value")
流血の

165

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

target_compile_options(first-test PRIVATE -fexceptions)

この方法の利点は、PUBLICおよびを介して、このターゲットに依存する他のターゲットへのオプションの伝播を制御できることですPRIVATE

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


2
私はそれを使おうとしました:target_compile_options(main_static PRIVATE --static)しかし、それはうまくいかないようです、なぜかどんな考え?
パヴェルSzczur

2
-staticおそらくリンカーであり、コンパイラオプションではありません。に渡してみてくださいtarget_link_libraries
vitaut 2016年

9
ああ、target_link_libraries私はドキュメントのその部分を見逃しました:「指定されたターゲットをリンクするときに使用するライブラリまたはフラグを指定してください。」ありがとう。
パヴェルSzczur

3
最近の追加:CMake 3.13はtarget_link_options、リンカーフラグを指定するためのより明確な方法として導入されています。target_link_libraries今後はリンカーフラグの使用を避け、target_link_options代わりに使用する必要があります。
ComicSansMS 2018年


46

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

set (CMAKE_CXX_FLAGS "-fexceptions")

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

へのフラグの追加CMAKE_EXE_LINKER_FLAGSは冗長です。


私はそれを試しましたが、それでもエラーが発生します。コンパイラフラグを指定する唯一の方法は、set(CMAKE_CXX_FLAGS "-fexceptions")ですか。
solti

3
私は問題を解決しましたが、良い方法ではなく、不十分な回避策です。コマンドラインで-DCMAKE_CXX_FLAGS = "-fexceptions"を作成しました。何らかの理由で、cmakeは.cmakeファイルからフラグを読み取っていません。:( ..答えてくれてありがとうサクラ..
solti

8
-DCMAKE_CXX_FLAGS = "-fexceptions" =と "の間にスペースを入れないでください
evandrix

あなたが言ったことに関して:「何らかの理由でcmakeは.cmakeファイルからフラグを読み取っていません。」既存のキャッシュをクリアしてください。これを行うには、cmakeを実行する前に、ビルドディレクトリからすべてを削除します。
在宅

1

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

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.