複数のターゲットが同じソースファイルを使用している場合、-save-tempsを使用してアセンブリファイルを保持するにはどうすればよいですか?

ErikSjölund

C ++プログラム/tmp/src/main.ccをコンパイルすると

#include <iostream>

int main() {

#ifdef demo1
  std::cout << "Output from demo1\n";
#endif

#ifdef demo2
  std::cout << "Output from demo2\n";
#endif

}

ファイル/tmp/src/CMakeLists.txtからのビルド手順を使用

cmake_minimum_required(VERSION 3.11)
project(test_save_temps LANGUAGES CXX)

function(my_add_executable name)
  add_executable(${name})
  target_sources(${name} PRIVATE main.cc)

  # target_compile_options(${name} PRIVATE --save-temps)

  target_compile_definitions(${name} PRIVATE
    ${name}
  )
endfunction()

my_add_executable(demo1)
my_add_executable(demo2)

すべてがOKに見えます。

ubuntu@laptop:/tmp$ mkdir /tmp/build
ubuntu@laptop:/tmp$ cd /tmp/build
ubuntu@laptop:/tmp/build$ cmake -G Ninja /tmp/src
-- The CXX compiler identification is GNU 8.2.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
ubuntu@laptop:/tmp/build$ ninja
[4/4] Linking CXX executable demo1
ubuntu@laptop:/tmp/build$ ls
build.ninja  CMakeCache.txt  CMakeFiles  cmake_install.cmake  demo1  demo2  rules.ninja
ubuntu@laptop:/tmp/build$ ./demo1
Output from demo1
ubuntu@laptop:/tmp/build$ ./demo2
Output from demo2
ubuntu@laptop:/tmp/build$

しかし、ファイル/tmp/src/CMakeLists.txtからコメントを削除して、行をアクティブ化すると

 target_compile_options(${name} PRIVATE --save-temps)

そして同じことをします

ubuntu@laptop:/tmp$ mkdir /tmp/build_with_save_temps
ubuntu@laptop:/tmp$ cd /tmp/build_with_save_temps
ubuntu@laptop:/tmp/build_with_save_temps$ cmake -G Ninja /tmp/src
-- The CXX compiler identification is GNU 8.2.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build_with_save_temps
ubuntu@laptop:/tmp/build_with_save_temps$ ninja
[4/4] Linking CXX executable demo1
ubuntu@laptop:/tmp/build_with_save_temps$ ls
build.ninja  CMakeCache.txt  CMakeFiles  cmake_install.cmake  demo1  demo2  main.ii  main.s  rules.ninja
ubuntu@laptop:/tmp/build_with_save_temps$ ./demo1
Output from demo1
ubuntu@laptop:/tmp/build_with_save_temps$ ./demo2
Output from demo1
ubuntu@laptop:/tmp/build_with_save_temps$ find . -name '*.s'
./main.s
ubuntu@laptop:/tmp/build_with_save_temps$ 

プログラムdemo2からの出力が正しくありません。

ビルドディレクトリでアセンブリファイルmain.sの2つのバージョンを見つけたいと思っていました。

ここで私は私のコンピュータシステムに関するいくつかの追加情報を提供します

  • cmake 3.13.2
  • g ++ 8.2.0
  • 忍者1.8.2
  • Ubuntu 18.10

/tmp/src/CMakeLists.txtを変更して、両方のバージョンのアセンブリファイルをmain.sのままにするにはどうすればよいですか?

ソリューションで更新

ユーザーfritzoneによる-save-temps=obj回答https://stackoverflow.com/a/53811064/757777で提案されているように使用する、すべてが機能し始めました

交換しました

target_compile_options(${name} PRIVATE --save-temps)

target_compile_options(${name} PRIVATE -save-temps=obj)

今、私は両方のアセンブリファイルを取得します

ubuntu@laptop:/tmp/build2$ find . -name '*.s'
./CMakeFiles/demo2.dir/main.cc.s
./CMakeFiles/demo1.dir/main.cc.s
ubuntu@laptop:/tmp/build2$

実行可能ファイルdemo1demo2は期待どおりに機能します

ubuntu@laptop:/tmp/build2$ ./demo1
Output from demo1
ubuntu@laptop:/tmp/build2$ ./demo2
Output from demo2
ubuntu@laptop:/tmp/build2$
フェレンツディーク

https://gcc.gnu.org/onlinedocs/gcc/Developer-Options.html#Developer-Options-save-temps=objに従って、オブジェクトファイルに基づいて一時ファイルを保存するには、コンパイラにオプションを指定する必要があります

したがって、cmakeファイルを次のように変更する必要があります。

target_compile_options(${name} PRIVATE -save-temps=obj)

(または同様の)コンパイルしようとするアプリケーションの名前に応じて一時ファイルを保存するため。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ