Your SlideShare is downloading. ×
  • Like
家に帰るまでが遠足です
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

家に帰るまでが遠足です

  • 1,555 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,555
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
6
Comments
0
Likes
6

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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