Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
「ビルド」とはなにをするか?
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Makoto Shimazu
April 15, 2015
Programming
66
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「ビルド」とはなにをするか?
EEIC後期実験「大規模ソフトウェアを手探る」の授業用スライド。
分割コンパイル・ビルドツール・静的リンク・動的リンクについて。
Makoto Shimazu
April 15, 2015
More Decks by Makoto Shimazu
See All by Makoto Shimazu
TSKaigi 2024 - 新サービス Progate Path の演習で TypeScript を採用して見えた教材観点からの利点と課題
makotoshimazu
1
1.1k
次世代コンピューターシステムの妄想と不揮発性メモリを活用したファイルシステム
makotoshimazu
0
61
Introduction of System Software for Persistent Memory (Reading Circle 2014/12/18)
makotoshimazu
0
48
A Survey on Efficient Utilization of Emerging Persistent Memory
makotoshimazu
0
42
スケジューラについての調査 - オペレーティングシステム授業発表
makotoshimazu
0
50
Other Decks in Programming
See All in Programming
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
830
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
140
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
290
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
110
Claspは野良GASの夢をみるか
takter00
0
170
Swiftのレキシカルスコープ管理
kntkymt
0
210
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
150
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
170
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
190
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
750
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
560
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
190
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
400
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
How STYLIGHT went responsive
nonsquared
100
6.2k
Deep Space Network (abreviated)
tonyrice
0
160
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
520
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
570
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
220
The Art of Programming - Codeland 2020
erikaheidi
57
14k
The Cult of Friendly URLs
andyhume
79
6.9k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Transcript
ばいなり! τ研 M2 島津 2015/10/15 ソ ー ス コ ー
ド ?
具体的内容 こんぱいる! ビルドツールってなにするの? (make, ninja, rake, autotools, cmake, gyp…) 静的ライブラリ(.a)ってなに?
▪ arコマンド 共有ライブラリ(.so)ってなに? ▪ LD_LIBRARY_PATH ▪ ldd 2
こんぱいる! ってどういうこと? 2つのイメージ(予想) 本当にやっていること ▪ どっちかっていうと前者 ▪ 後者は、いちいつ打つのが面倒だからコマンド一発で出来るように簡単に している $(CC) $(CFLAGS)
-c –o $(OBJDIR)/hoge.o hoge.c $ ./configure --prefix=../hogedir $ make –j16 ぶわー $ make install $ gcc hello.c $ ./a.out hello. 3
こんぱいる!のイメージ図 ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $
gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c 実行ファイル 4
こんぱいる!のやることの手順 オブジェクトファイルの生成 (狭義のコンパイル) ▪ .c -> .o ▪ .oはすでにコンパイル済み(機械語)のプログラムが入っている バイナリの生成 (リンク)
▪ .oにあるプログラムをリンクする main.oとhello.oの関数を一つのファイルにまとめる 関数名を見て、ジャンプする命令のアドレスを決める (cf. アーキテクチャのI型の命令) $ gcc –c hello.c $ gcc –c main.c $ ls hello.c hello.o main.c main.o $ gcc –o wei.bin main.o hello.o 5
ビルドツールの必要性 ファイルが多くなると・・・? ▪ たとえば、chromiumだったら20000ファイルを超える! ▪ 全部のファイルに対してコマンドラインを書いてシェルスクリプトを書く? ▪ つらみしか感じない いい感じにしてくれるツールが? ▪
ビルドツール 6 ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $ gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c 実行ファイル
ビルドツール – make, ninja, rake… make, ninja, rake ▪ ”依存関係”を解決しながらコマンドを実行してくれるツール
▪ ”依存”するファイルが更新されると、そのコマンドが実行される ▪ 変えたファイルに関係するコマンドだけしか実行されない! ソースコード (*.c, *.cpp) オブジェクトファイル(*.o) $ gcc –c main.c $ gcc –o main.bin main.o hello.o pyoo.o hello.c main.c pyoo.c 実行ファイル 7
makeの例 makeコマンドの設定ファイル:makefile ▪ こんな感じで書けば、main.o/hello.o/pyoo.oを使ってwei.binが生成できる ▪ もっと詳しい使い方はいろいろ調べてみてください! ▪ (個人的には次に説明する gypをつかってmakefileやninjaのファイルを生成するのがマイブームで す)
8 wei.bin: main.o hello.o pyoo.o gcc -o $@ $^ %.o: %.c gcc -c $<
メタビルドシステム - autotools, cmake, gyp… ビルドに必要なファイルを生成するシステム ▪ makefileやsln(Visual Studio向けプロジェクトファイル)、xcodeなど ▪
cmakeやgypなどではクロスプラットフォーム向けに書いたりもできる やってくれること ▪ 環境に応じていい感じのmakefileなどを作ってくれる ▪ autotoolsだと、configureしたときに環境に応じたヘッダファイルも生成してくれ る ▪ これらにより、同じプログラムをいろんな環境で簡単に動かせる よくある使い方 $ ./configure –prefix=/home/denjo/gnuplot_install makefileなどを生成! $ make gccつかったコマンドをいい感じに実行! $ make install いい感じの場所にファイルをコピー! 9
ビルドシステムのまとめ 結局のところなにをやっているのか? ▪ gccやclangを動かしている ▪ そのための便利ツールがmakeやninja ▪ それを準備するための便利ツールがautotoolsやcmakeやgyp よくわからない挙動をした場合には・・・ ▪
立ち戻ってgccなどのオプションがいい感じになっているかをチェックする ▪ どうせコマンド実行しているだけなので、表示されたコマンドを手で実行してみ るのも手 覚えておくと便利な環境変数 ▪ C_INCLUDE_PATH, CPP_INCLUDE_PATH, LIBRARY_PATH ▪ デフォルト以外のincludeパスやライブラリの検索元(後述)を追加できる 10
ライブラリ ライブラリとは? ▪ 一言で言うと、オブジェクトファイルの塊 ▪ 利用しやすいように、オブジェクトファイルを一つのファイルにまとめたもの(ex. libc) 11 ソースコード (*.c,
*.cpp) オブジェクトファイル (*.o) 実行ファイル $ gcc –c hello.c $ gcc –o main.bin main.o hello.o pyoo.o main.c hello.c pyoo.c main.c hello.c pyoo.c ライブラリ(*.a)
ライブラリの操作 使い方 ▪ arコマンドで作成 ▪ コンパイル時には.oと同じようにファイルを指定して使うか、-lhogeのようにする 12 $ gcc –c
hello.c $ gcc –c pyoo.c $ ar rsv libhello.a hello.o pyoo.o $ ls libhello.a hello.c hello.o main.c pyoo.c pyoo.o $ gcc –c main.c $ gcc –o main.bin main.o –lhello –L. libhello.a hello.c hello.o main.bin main.c main.o pyoo.c pyoo.o -lと-Lという2つのオプションは覚えておくとよい。 -lがライブラリ名を指定していて、-Lはライブラリの検索元を指定している。
静的ライブラリの問題点 コードサイズの肥大化 ▪ 静的ライブラリは、バイナリがすべてのコードを持つ ▪ たくさんのプログラムが同じライブラリを使っていた場合... 13 main1.c main2.c
共有ライブラリ(.so, shared objects) ライブラリの共通化 ▪ 実行時に同じライブラリを使うようにする ▪ これが共有ライブラリ 14 main1.c
main2.c
実際の使い方 動き ▪ サーチパス(/etc/ld.so.confやLD_LIBRARY_PATH)から勝手にsoファイルを 探してくる lddコマンド:依存している共有ライブラリを見れる ▪ 実行時に探したいパスを追加するときには、ビルド時にオプションを追加 -Wl,-rpath=$PWDや-Wl,-R $PWDとか
コマンド 15 $ cd lib $ gcc -fPIC –c hello.c $ gcc -fPIC –c pyoo.c $ gcc –shared –fPIC –o libhello.so hello.o pyoo.o $ ls libhello.so hello.c hello.o pyoo.c pyoo.o $ cd .. $ gcc –Wl,-R $PWD/lib –o main.bin main.c –lhello –Llib $ ls lib main.c main.bin ディレクトリ構成 +- main.c +- lib +- hello.c +- pyoo.c -fPICはとりあえず呪文ということで・・・ (興味あったら聞いてください)
共有ライブラリのサーチパス 実行時にいちいちファイルを探す…どこから? ▪ 確認1: lddコマンドを使ってみる ▪ 確認2: /etc/ld.so.confを見てみる (見るとinclude /etc/ld.so.conf.dをしているので、実際には
/etc/ld.conf.so.dを見る) ▪ 確認3: gccのオプションに-vをつけてみる 16 main1.c main2.c 実行時に探す
よくあるシチュエーション ライブラリをビルドしてインストールしたいけど、 自前でビルドしたものと元からはいってるものをちゃんとわけたい! ▪ ./configure –-prefix=… をつかってインストール先を設定 ▪ LIBRARY_PATHとLD_LIBRARY_PATHの2つの環境変数を設定 LIBRARY_PATH:
プログラムのビルド時につかうライブラリの位置 LD_LIBRARY_PATH: プログラムの実行時に含めるサーチパス 17 いろいろありそうなタイトルを付けたけど、 個人的に思い当たるのはこれだけだった・・・
まとめ ビルドツールとは ▪ gcc, clangなどをいい感じに実行してくれる便利ツール ▪ C_INCLUDE_PATH/CPP_INCLUDE_PATH/LIBRARY_PATHを使って 読み込むディレクトリを指定できる ライブラリとは ▪
オブジェクトファイルを1つにまとめたもの ▪ 静的ライブラリを使うと最終的にできるバイナリにすべてが含まれる ▪ 共有ライブラリを使うと、実行時に検索・リンクが行われる ▪ LD_LIBRARY_PATHを使って、サーチパスを追加できる 18
おまけ 僕(島津)の環境の例 ▪ 自前でビルドしたものは/home/shimazu/local以下におく つまりprefixは $HOME/local にしてる ▪ インクルードパスやライブラリのパスを環境変数で追加 ▪
参考になれば幸いです。 19 export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$HOME/local/include export C_INCLUDE_PATH=$C_INCLUDE_PATH:$HOME/local/include export LIBRARY_PATH=$LIBRARY_PATH:$HOME/local/lib:$HOME/local/lib/x86_64-linux-gnu export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$HOME/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH ディレクトリ構成 /home/shimazu +- local +- bin +- lib +- include ...
(ちょっとだけ)soのバージョンの話 ▪ libxxx.soは最新のlibxxx.so.Nへのリンク ▪ libxxx.so.Nは最新のlibxxx.so.N.Mへのリンク ▪ プログラム側で利用するのはlibxxx.so.N ▪ libxxx.so.Nはsonameと呼ばれる ▪
libxxx.soはlinker nameと呼ばれる ▪ libxxx.so.N.M.Xはreal name 20
細かい話(あまり重要ではない) 関数の呼び出しをオペランドでできない→テーブルからジャンプ ▪ PLT, GOT(簡単に話す?) 21