家に帰るまでが遠足です

2,577 views

Published on

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,577
On SlideShare
0
From Embeds
0
Number of Embeds
194
Actions
Shares
0
Downloads
8
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

家に帰るまでが遠足です

  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

×