web-dev-qa-db-ja.com

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

私は Scientific Linux (SL)を使用しています。一連のC++(.cpp)ファイルを使用するプロジェクトをコンパイルしようとしています。

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?ある場合、どのCMakeListsですか? project/Buildまたはproject/src/project

19
user4352158

チップの答えは役に立ちましたが、SET行がCMAKE_CXX_FLAGS_DEBUGを上書きしたため、-gデフォルトが削除され、デバッグ情報なしで実行可能ファイルがビルドされました。デバッグ情報and-O0最適化(cmakeバージョン2.8.12.2)を使用してビルドされた実行可能ファイルを取得するには、プロジェクトソースディレクトリのCMakeLists.txtに小さな追加の変更を加える必要がありました。

以下を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)

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

11
dan

または呼び出し時に:

cmake -DCMAKE_BUILD_TYPE=DEBUG \
      -DCMAKE_C_FLAGS_DEBUG="-g -O0" \
      -DCMAKE_CXX_FLAGS_DEBUG="-g -O0"

次に確認します:

make VERBOSE=1

https://stackoverflow.com/questions/5820303/how-do-i-force-make-gcc-to-show-me-the-commands で説明されているGCCビルドコマンドを表示するには

Ubuntu 17.04、CMake 3.7.2でテスト済み。

これを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
Chip Christian