CMakeを使用して-O0を最適化せずにコンパイルする方法

CMakeを使用して-O0を最適化せずにコンパイルする方法

使っていますScientificLinux(SL).複数のC ++(.cpp)ファイルを使用するプロジェクトをコンパイルしようとしています。

そのディレクトリに compileとuser/project/Build入力makeし、すべての .cpp ファイルをリンクします。それから行ってタイプuser/run/しなければなりません。./run.sh values.txt

GDBを使用してデバッグするには、に移動して入力してuser/run実行gdb ../project/Build/bin/Projectする必要がありますrun -Project INPUT/inputfile.txt。ただし、変数の値を印刷しようとしていますp variablename

しかし、メッセージを受け取りましたs1 = <value optimized out>。オンラインでいくつかの調査を行いましたが、-O0この問題を解決するには最適化なしでコンパイルする必要があるようです。しかし、どこで入力しますか?内部にCMakeLists?では、どのCMakeListが必要ですか?project/Buildまたはいずれかproject/src/project

答え1

呼び出されたときに通常CMakeを使用してデバッグビルドに必要なものは次のとおりです。

cmake -DCMAKE_BUILD_TYPE=Debug ..

これにより-gフラグが追加され、次のように確認できます。

make VERBOSE=1

以下に説明するように、GCCビルドコマンドが表示されます。https://stackoverflow.com/questions/5820303/how-do-i-force-make-gcc-to-show-me-the-commands

-O0デフォルトではビルドに追加されませんが、Debug以下のように-O0デフォルトです。-Ohttps://stackoverflow.com/questions/1778538/how-many-gcc-optimization-levels-are-thereなどman gccなので、一般的に重要ではありません。

デバッグ用にビルドフラグを明示的に制御するには、次のようにすることもできます。

cmake -DCMAKE_BUILD_TYPE=Debug
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0" \
      ..

CMAKE_C_FLAGS_DEBUGとのデフォルト値は次のとおりですCMAKE_CXX_FLAGS_DEBUGhttps://stackoverflow.com/questions/16851084/how-to-list-all-cmake-build-options-and-their-default-valuesそして:

cmake -LAH .

これは作る:

// Flags used by the CXX compiler during DEBUG builds.                                                   
CMAKE_CXX_FLAGS_DEBUG:STRING=-g                                                                          
                                                                                                                                                                                          
// Flags used by the C compiler during DEBUG builds.                                                     
CMAKE_C_FLAGS_DEBUG:STRING=-g

このコマンドは、ビルドタイプのデフォルトの動作を明確にする他の関心のある値も表示します。

// Flags used by the CXX compiler during all build types.                               
CMAKE_CXX_FLAGS:STRING=                

// Flags used by the CXX compiler during DEBUG builds.                                       
CMAKE_CXX_FLAGS_DEBUG:STRING=-g             

// Flags used by the CXX compiler during MINSIZEREL builds.                               
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG

// Flags used by the CXX compiler during RELEASE builds.                                         
CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG     

// Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG

-DCMAKE_BUILD_TYPE=Debug渡されない場合は空で、CMAKE_BUILD_TYPE追加のCMAKE_CXX_FLAGS_XXX値は追加されないため、noで終わります-g

Ubuntu 22.10、CMake 3.24.2でテストされました。

答え2

Chipの答えは役に立ちましたが、その行SETはデフォルト値をオーバーライドするため、デバッグ情報なしで実行可能ファイルが作成されました。デバッグ情報で構築された実行可能ファイルを取得するには、プロジェクトソースディレクトリのCMakeLists.txtを少し追加で変更する必要があります。CMAKE_CXX_FLAGS_DEBUG-gそして -O0最適化されました(cmakeバージョン2.8.12.2から)。

CMakeLists.txtに次のものを追加して有効な状態を-O0維持しました-g

# Add -O0 to remove optimizations when using gcc
IF(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")
ENDIF(CMAKE_COMPILER_IS_GNUCC)

これは-O0CMakeがすでにデバッグに使用しているフラグに最適化を追加し、クロスプラットフォームプロジェクトを使用している場合にのみGCCビルドに含まれます。

答え3

CMakeLists.txt(プロジェクトソースディレクトリのエントリ、ビルドディレクトリでは何も触れないでください)に次のものを追加します。

SET(CMAKE_CXX_FLAGS_DEBUG "-O0")
SET(CMAKE_C_FLAGS_DEBUG "-O0")

それから

$ cmake -DCMAKE_BUILD_TYPE=Debug

動作します。またはCMakeLists.txtに以下を追加してください。

SET(CMAKE_CXX_FLAGS "-O0")
SET(CMAKE_C_FLAGS "-O0")

答え4

一部のテストでは、デフォルトでいくつかのCMAKE_C_FLAGS最適化オプション(たとえば、-O2この場合、上記で提案したものと同様の操作を実行しても最適化は無効set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0")になりません"-O2 -g -O0"

"-O#"代わりに単純な正規表現を使用して"-O0"

私の正規表現には微調整が必​​要な場合がありますが、これまでは十分に機能しているようです。

option(OPTIMIZE "Allow compiler optimizations.  Set to OFF to disable" ON)

if(NOT OPTIMIZE)
    string(REGEX REPLACE "(\-O[011123456789])" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    string(REGEX REPLACE "(\-O[011123456789])" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
endif()

関連情報