Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

家に帰るまでが遠足です

2,814 views

Published on

  • Be the first to comment

家に帰るまでが遠足です

  1. 1. 家に帰るまでが遠⾜です. 2012/07/28 Cryolite Boost.勉強会 #10 東京 1
  2. 2. 家に帰るまでが遠⾜です. 2
  3. 3. 遠⾜が終わって安⼼していませんか? 3
  4. 4. ソースコードを書き終わって安⼼していませんか? 4
  5. 5. ソースコードを書き終わって安⼼していませんか? プリプロセスが終わった だけで安⼼していませんか? 5
  6. 6. ソースコードを書き終わって安⼼していませんか? プリプロセスが終わった だけで安⼼していませんか? コンパイルが終わった だけで安⼼していませんか? 6
  7. 7. ソースコードを書き終わって安⼼していませんか? プリプロセスが終わった だけで安⼼していませんか? コンパイルが終わった だけで安⼼していませんか?※彼らは特殊な訓練を受けています 決して真似しないでください 7
  8. 8. ソースコードを書き終わって安⼼していませんか? プリプロセスが終わった だけで安⼼していませんか? コンパイルが終わった だけで安⼼していませんか?※彼らは特殊な訓練を受けています 決して真似しないでください 8
  9. 9. プログラムを実⾏するまでが C++ です. 9
  10. 10. プログラムを実⾏する までが C++ です.$ g++ ‐c main.cpp 10
  11. 11. プログラムを実⾏する までが C++ です.$ g++ ‐c main.cpp$ g++ main.o 11
  12. 12. プログラムを実⾏する までが C++ です.$ g++ ‐c main.cpp$ g++ main.o$ ./a.out 12
  13. 13. プログラムを実⾏する までが C++ です.$ g++ ‐c main.cpp$ g++ main.o$ ./a.outSegmentation fault (core dumped) 13
  14. 14. プログラムを実⾏する までが C++ です.$ g++ ‐c main.cpp$ g++ main.o$ ./a.outSegmentation fault (core dumped) ここまでが C++ による プログラミングです 14
  15. 15. 実⾏するまでが C++ です. 2012/07/28 Cryolite Boost.勉強会 #10 東京 15
  16. 16. C++ プログラムを実⾏するには•コンパイルして,•リンクして,•実⾏する必要があります 16
  17. 17. C++ プログラムを実⾏するには•コンパイルして,•リンクして,•実⾏する必要があります,が! 17
  18. 18. C++ プログラムを実⾏するには•コンパイルして,•リンクして,•実⾏する必要があります,が! 18
  19. 19. こういうことがしたいと思ったことはありませんか? 19
  20. 20. 複数のビルド設定で同時⼀⻫にビルドしたい 20
  21. 21. デバッグビルド & リリースビルド デバッグ情報あり 最適化なし$ g++ ‐g main.cpp and デバッグ情報なし 最適化あり$ g++ ‐O3 main.cpp 21
  22. 22. シングルスレッド &マルチスレッド スレッドなし$ g++ ‐DSINGLE_THREAD main.cpp and スレッドあり$ g++ ‐DMULTI_THREAD ‐pthread main.cpp 22
  23. 23. コンパイラの 複数のバージョン$ g++‐4.6 main.cpp and$ g++‐4.7 main.cpp 23
  24. 24. 旧規格 & 新規格$ g++ ‐std=c++03 main.cpp and$ g++ ‐std=c++11 main.cpp 24
  25. 25. 複数のコンパイラ$ g++ main.cpp and$ clang++ main.cpp 25
  26. 26. どうすれば実現できる? 26
  27. 27. どうすれば実現できる? 27
  28. 28. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjam variant=debug,release 28
  29. 29. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjam variant=debug,release feature (ビルド設定の各側⾯を抽象化したもの) 29
  30. 30. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjam variant=debug,release feature の値 30
  31. 31. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjam variant=debug,release デバッグビルドとリリースビルドを 同時⼀⻫にビルド 31
  32. 32. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjamthreading=single,multi スレッドのある・なしを 同時⼀⻫にビルド 32
  33. 33. Boost.Build を使えば……# jamfileexe main.exe : main.cpp ;$ bjam toolset=gcc‐4.6.3,gcc‐4.7.1 variant=debug,releasethreading=single,multi 33
  34. 34. {GCC 4.6.3, GCC 4.7.1} ×Boost.Build を使えば…… {デバッグビルド,リリースビルド} × {シングルスレッド,マルチスレッド}# jamfileexe main.exe : main.cpp ; の合計8通りのビルド設定同時⼀⻫$ bjam toolset=gcc‐4.6.3,gcc‐4.7.1 variant=debug,releasethreading=single,multi 34
  35. 35. Boost.Build の中で何が起こってるのか? 35
  36. 36. Boost.Build の中で何が起こってるのか? Boost.Build の 中身を見てみよう 36
  37. 37. Boost.Build のターゲットと実際のファイルは一対多# jamfileexe main.exe : main.cpp ; 37
  38. 38. Boost.Build のターゲットと実際のファイルは一対多 <variant>debug bin/debug/main.o# jamfile bin/debug/mainexe main.exe : main.cpp ; 38
  39. 39. Boost.Build のターゲットと実際のファイルは一対多 <variant>debug bin/debug/main.o# jamfile bin/debug/mainexe main.exe : main.cpp ; bin/release/main.o <variant>release bin/release/main 39
  40. 40. Boost.Build のターゲットと実際のファイルは一対多 <variant>debug bin/debug/main.o# jamfile bin/debug/mainexe main.exe feature が依存物の : main.cpp ; パスとして埋め込まれる bin/release/main.o <variant>release bin/release/main 40
  41. 41. 41
  42. 42. こういうことがしたいと思ったことはありませんか? 42
  43. 43. 依存物全部に同じビルド設定を反映させたい 43
  44. 44. 最終成果物がリリースなら 中間⽣成物も全部リリースfoo.obar.o リリースビルド リンク 実⾏バイナリmain.o 44
  45. 45. 最終成果物がリリースなら 中間⽣成物も全部リリースfoo.o 最終成果物をリリース ビルドするなら……bar.o リリースビルド リンク 実⾏バイナリmain.o 45
  46. 46. 最終成果物がリリースなら 中間⽣成物も全部リリース 中間⽣成物も全部 リリースビルドfoo.o 最終成果物をリリース $ g++ ‐O3 –c foo.cpp ビルドするなら……bar.o リリースビルド リンク$ g++ ‐O3 –c bar.cpp 実⾏バイナリmain.o$ g++ ‐O3 –c main.cpp 46
  47. 47. 最終成果物がデバッグなら 中間⽣成物も全部デバッグfoo.obar.o デバッグビルド リンク 実⾏バイナリmain.o 47
  48. 48. 最終成果物がデバッグなら 中間⽣成物も全部デバッグfoo.o 最終成果物をデバッグ ビルドするなら……bar.o デバッグビルド リンク 実⾏バイナリmain.o 48
  49. 49. 最終成果物がデバッグなら 中間⽣成物も全部デバッグ 中間⽣成物も全部 デバッグビルドfoo.o 最終成果物をデバッグ $ g++ ‐g –c foo.cpp ビルドするなら……bar.o デバッグビルド リンク$ g++ ‐g –c bar.cpp 実⾏バイナリmain.o$ g++ ‐g –c main.cpp 49
  50. 50. 共有ライブラリをビルドす るなら中間⽣成物全部 PICfoo.obar.o リンク libfoo.sobaz.o Linux/ELF 50
  51. 51. 共有ライブラリをビルドす るなら中間⽣成物全部 PICfoo.o 共有ライブラリを ビルドするなら……bar.o リンク libfoo.sobaz.o Linux/ELF 51
  52. 52. 共有ライブラリをビルドす るなら中間⽣成物全部 PIC 中間⽣成物 全部 PICfoo.o 共有ライブラリを $ g++ ‐fPIC –c foo.cpp ビルドするなら……bar.o libfoo.so$ g++ ‐fPIC リンク –c bar.cppbaz.o$ g++ ‐fPIC –c baz.cpp Linux/ELF 52
  53. 53. どうすれば実現できる? 53
  54. 54. どうすれば実現できる? 54
  55. 55. Boost.Build を使えば……# jamfileexe main.exe : main.cpp foo.cpp bar.cpp ;$ bjam variant=release main.exe 全ての中間⽣成物が リリースでビルド 55
  56. 56. Boost.Build の中で何が起こってるのか? 56
  57. 57. Boost.Build の中で何が起こってるのか? Boost.Build の 中身を見てみよう 57
  58. 58. feature の伝播(feature propagation)# jamfileobj foo.obj : foo.cpp ;obj main.obj : main.cpp ;exe main.exe : main.obj foo.obj ; 58
  59. 59. feature の伝播(feature propagation)# jamfileobj foo.obj : foo.cpp ;obj main.obj : main.cpp ;exe main.exe : main.obj foo.obj ;$ bjam variant=debug main.exe 59
  60. 60. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj jamfile 上の依存関係 main.exe 60
  61. 61. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj main.exe <variant>debug 61
  62. 62. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj <variant>debug <variant>debug main.exe <variant>debug 62
  63. 63. feature の伝播(feature propagation) 依存先の feature がfoo.cpp main.cpp依存元へ⾃動的に伝播するfoo.obj main.obj <variant>debug <variant>debug main.exe <variant>debug 63
  64. 64. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj <variant>debug <variant>debug main.exe <variant>debug 64
  65. 65. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj <variant>debug <variant>debug 以下,さっきの復習 main.exe <variant>debug 65
  66. 66. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj <variant>debug <variant>debug bin/debug/foo.o bin/debug/main.o main.exe <variant>debug 66 bin/debug/main
  67. 67. feature の伝播(feature propagation)foo.cpp main.cppfoo.obj main.obj <variant>debug <variant>debug bin/debug/foo.o bin/debug/main.o main.exe <variant>debug 67 bin/debug/main
  68. 68. feature の伝播(feature propagation)foo.cpp main.cpp$ g++ ‐g ‐c foo.cpp $ g++ ‐g ‐c main.cppfoo.obj main.obj <variant>debug <variant>debug bin/debug/foo.o bin/debug/main.o $ g++ foo.o main.o –o main main.exe <variant>debug 68 bin/debug/main
  69. 69. feature の伝播(feature propagation)foo.cpp main.cpp$ g++ ‐g ‐c foo.cpp $ g++ ‐g ‐c main.cppfoo.obj main.obj やりたかったことが <variant>debug <variant>debug 実現できました bin/debug/foo.o bin/debug/main.o $ g++ foo.o main.o –o main main.exe <variant>debug 69 bin/debug/main
  70. 70. feature の伝播(feature propagation)# jamfileobj foo.obj : foo.cpp ;obj main.obj : main.cpp ;exe main.exe : main.obj foo.obj ;$ bjam variant=release main.exe 70
  71. 71. feature の伝播(feature propagation)# jamfileobj foo.obj : foo.cpp ;obj main.obj : main.cpp ;exe main.exe : main.obj foo.obj ;$ bjam variant=debug,release main.exe 71
  72. 72. 72
  73. 73. こういうことで困ったことはありませんか? 73
  74. 74. // foo.hppclass Foo{ .....#if defined(CHECK) DebugInfo dbg_info_;#endif}; 74
  75. 75. // foo.hpp マクロ定義でclass Foo ABI が変化{ .....#if defined(CHECK) DebugInfo dbg_info_;#endif}; 75
  76. 76. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include #endif bar.cpp }; main.cpp 76
  77. 77. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include #endif bar.cpp }; main.cpp$ g++ ‐DCHECK –c bar.cpp $ g++ –c main.cpp bar.o main.o 77
  78. 78. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include #endif bar.cpp }; main.cpp$ g++ ‐DCHECK –c bar.cpp $ g++ –c main.cpp bar.o Foo のオブジェクトをやり取り main.o 78
  79. 79. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include #endif bar.cpp }; main.cpp$ g++ ‐DCHECK –c bar.cpp $ g++ –c main.cpp bar.o Foo のオブジェクトをやり取り main.o $ g++ main.o bar.o a.out 79
  80. 80. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include #endif bar.cpp }; main.cpp$ g++ ‐DCHECK –c bar.cpp $ g++ –c main.cpp bar.o Foo のオブジェクトをやり取り main.o $ g++ main.o bar.o a.out 80
  81. 81. // foo.hpp マクロ定義で class Foo ABI が変化 { ..... #if defined(CHECK)#include DebugInfo dbg_info_; #include ABI を変化させる #endif bar.cpp }; main.cpp マクロ定義を 安全に扱いたい$ g++ ‐DCHECK –c bar.cpp $ g++ –c main.cpp bar.o Foo のオブジェクトをやり取り main.o $ g++ main.o bar.o a.out 81
  82. 82. ユーザ定義の ABI をビルドチェイン全体で統⼀したい 82
  83. 83. どうすれば解決できる? 83
  84. 84. どうすれば解決できる? 84
  85. 85. Boost.Build を使えば……# jamfileimport feature ;feature.feature check : off on : propagated ;feature.compose <check>on : <define>CHECK ; 85
  86. 86. Boost.Build を使えば……# jamfile 新しい feature <check> をユーザ定義import feature ;feature.feature check : off on : propagated ;feature.compose <check>on : <define>CHECK ; 86
  87. 87. Boost.Build を使えば……# jamfile 新しい feature <check> をユーザ定義import feature ;feature.feature check : off on : propagated ; なら <check>on “CHECK” マクロを定義feature.compose <check>on : <define>CHECK ; 87
  88. 88. Boost.Build を使えば……# jamfileexe main.exe : bar.cpp main.cpp ; $ bjam check=on main.exe 以下,さっきの復習 88
  89. 89. Boost.Build を使えば……# jamfileexe main.exe : bar.cpp main.cpp ; $ bjam check=off main.exe 89
  90. 90. Boost.Build を使えば……# jamfileexe main.exe : bar.cpp main.cpp ; $ bjam check=on,off main.exe 90
  91. 91. 91
  92. 92. こういうことで困ったことはありませんか? 92
  93. 93. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o 93
  94. 94. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐lfoo –o test test 94
  95. 95. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐lfoo –o test test $ ./test 95
  96. 96. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐lfoo –o test foo が見つからねーよ! 96
  97. 97. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐L. ‐lfoo –o test test 97
  98. 98. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐L. ‐lfoo –o test test $ ./test 98
  99. 99. 共有ライブラリに依存したバイナリを実⾏したい foo.cpp$ g++ ‐fPIC –shared … libfoo.so test.o $ g++ test.o ‐L. ‐lfoo –o test test $ ./test libfoo.so 見つからねーよ! 99
  100. 100. どうすれば解決できる? 100
  101. 101. どうすれば解決できる? 101
  102. 102. Boost.Build を使えば……# jamfilelib foo.lib : foo.cpp ;run test.run : test.obj foo.lib ; $ bjam test.run これだけで O.K.! 102
  103. 103. Boost.Build の中で何が起こってるのか? 103
  104. 104. Boost.Build の中で何が起こってるのか? Boost.Build の 中身を見てみよう 104
  105. 105. usage-requirement(これを使うならこうしろ!)foo.lib test.obj test.exe test.run 105
  106. 106. foo.lib の usage-requirements:usage-requirement <library‐path>bin/debug(これを使うならこうしろ!)<xdll‐path>bin/debugfoo.lib test.obj test.exe test.run 106
  107. 107. foo.lib の usage-requirements:usage-requirement <library‐path>bin/debug(これを使うならこうしろ!)<xdll‐path>bin/debugfoo.lib test.obj 依存先に usage-req. が ⾃動的に伝播する test.exe <library-path>bin/debug test.run <xdll-path>bin/debug 107
  108. 108. usage-requirement(これを使うならこうしろ!)foo.lib test.obj test.exe <library-path>bin/debug test.run <xdll-path>bin/debug 108
  109. 109. usage-requirement(これを使うならこうしろ!)foo.lib test.obj bin/debug/libfoo.so test.exe <library-path>bin/debug bin/debug/test test.run <xdll-path>bin/debug 109 bin/debug/test.run
  110. 110. usage-requirement(これを使うならこうしろ!)foo.lib test.obj bin/debug/libfoo.so test.exe $ g++ ‐Lbin/debug … <library-path>bin/debug bin/debug/test $ LD_LIBRARY_PATH=bin/debug … test.run <xdll-path>bin/debug 110 bin/debug/test.run
  111. 111. usage-requirement(これを使うならこうしろ!)foo.lib test.obj bin/debug/libfoo.so test.exe $ g++ ‐Lbin/debug …やりたかったことが <library-path>bin/debug 実現できました bin/debug/test $ LD_LIBRARY_PATH=bin/debug … test.run <xdll-path>bin/debug 111 bin/debug/test.run
  112. 112. まだまだ紹介していない機能・概念がたくさんありますがお時間となりました. 112
  113. 113. Cry’s Diary or #11 ?? 113

×