CMakeを使用してCFLAGSおよびCXXFLAGSオプションを設定します


88

Linuxで実行されているコードをデバッグしたいだけで、デバッグビルド(-O0 -ggdb)が必要です。だから私はこれらのものを私のに追加しましたCMakeLists.txt

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")

コンパイルしようとすると、使用して冗長になりmake VERBOSE=1 、次のような出力を観察しました。

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...

どうやらコードはでコンパイルされて"-g -O2"おり、これは私が望むものではありません。どうすれば強制的に"-O0 -ggdb"のみ使用させることができますか?


1
デバッグ可能なビルドが必要な場合は、コマンドラインでdebugconfigureを実行するだけです。「cmake-DCMAKE_BUILD_TYPE =デバッグ」。結果のビルドでは、特定のビルドシステムのデバッグフラグがオンになります。cmakeファイル自体を変更する理由はありません。別の-D引数を使用してCMAKE_C_FLAGS値を送信することもできます。
atifm 2016年

回答:


83

あなたはフラグを設定する必要がありますproject、あなたのCMakeLists.txtでコマンド。

また、include(${QT_USE_FILE})またはを呼び出す場合は、Qtコマンドの後add_definitions(${QT_DEFINITIONS})にこれらのsetコマンドを含める必要があります。これらのコマンドはさらにフラグを追加するためです。その場合、Qtフラグにフラグを追加したいだけなので、次のように変更します。

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -ggdb")

プロジェクトコマンドの後にこれらのフラグを配置しました。しかし、出力は同じです。
majie 2012

QT_NO_EXCEPTIONSあなたの旗に気づいたので、答えを少し広げました。を${QT_DEFINITIONS}追加していると思い-g -O2ます。
フレイザー

1
はい、これです。これらのsetコマンドをQtコマンドの後に置くと、問題が解決します。どうもありがとうございました。
majie 2012

18

私にとってうまく機能する最も簡単な解決策はこれです:

export CFLAGS=-ggdb
export CXXFLAGS=-ggdb

CMakeはそれらをすべての構成のフラグに追加します。必ずCMakeキャッシュをクリアしてください。


3
このような環境でフラグを設定することが、CMakeLists.txtを変更せずに行う唯一の方法です。環境値は最初の構成でのみ読み取られ、次にキャッシュに入れられることに注意してください。したがって、これを変更する場合は、CMakeキャッシュをクリアし、envの新しい値を使用して構成ステップを再実行する必要があります。ドキュメント:cmake.org/cmake/help/latest/envvar/CFLAGS.html cmake.org/cmake/help/latest/envvar/CXXFLAGS.html
bleater

3
それは「最も簡単」ではありません、それがそれをする唯一の正しい方法です。
スラヴァ

マイナーなキャッチ。ジェネレーターが特定のビルドタイプ(たとえば、CMAKE_CXX_FLAGS_DEBUG など)に対して特定のフラグを構成している場合、それを含めるCXXFLAGS(そしてそれを挿入するCMAKE_CXX_FLAGS)だけでは、オプションをコンパイラーに渡すのに実際には十分ではありません。ビルドタイプごとの構成は、ユーザー入力よりも優先されます。
内線3h

15

cmake C / CXXのデフォルトのフラグを変更する必要があります。

CMAKE_BUILD_TYPE={DEBUG/MINSIZEREL/RELWITHDEBINFO/RELEASE} のメインのCMakeLists.txtものに入れると:

Cの場合

set(CMAKE_C_FLAGS_DEBUG "put your flags")
set(CMAKE_C_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_C_FLAGS_RELEASE "put your flags")

C ++の場合

set(CMAKE_CXX_FLAGS_DEBUG "put your flags")
set(CMAKE_CXX_FLAGS_MINSIZEREL "put your flags")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "put your flags")
set(CMAKE_CXX_FLAGS_RELEASE "put your flags")

これにより、CMakeCache.txtで定義されている値が上書きされます


これは、現在のcmakeフラグを上書きします。あなた自身(GCC)-gフラグを追加しない限り、デバッグ壊し、それはそう
activedecay

「ModernCmake」構文を使用して同じ考えがありますか?
サンドバーグ

6

Unixシステムでは、いくつかのプロジェクトで、これらの行をCMakeLists.txtに追加しましたが、ベース/ usr / include)とローカルインクルード(/ usr / local / include)が別々のディレクトリにあるため、正常にコンパイルされました。

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I/usr/local/include -L/usr/local/lib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")

CおよびC ++コンパイラフラグのパスやリンカフラグの正しいディレクトリパスなど、正しいディレクトリを追加します。

注:C ++コンパイラ(c ++)は-Lをサポートしていないため、CMAKE_EXE_LINKER_FLAGSを使用する必要があります


3
旗のinclude_directories代わりに使うほうがいいのでは-Iないですか?
TejasKale19年

どうもありがとうございます。リンカフラグをに配置してCMAKE_CXX_FLAGSいたため、無視されていました。私CMAKE_EXE_LINKER_FLAGSがあなたの答えに基づいてそれらを配置したので、それらはうまく機能しています。
ナヒヤン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.