使っています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
デフォルトです。-O
https://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_DEBUG
。https://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)
これは-O0
CMakeがすでにデバッグに使用しているフラグに最適化を追加し、クロスプラットフォームプロジェクトを使用している場合にのみ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()