コンパイラ等のメモ

コンパイルオプション

オプション 意味
-I ヘッダファイルの検索ディレクトリを追加
-L リンカの検索ディレクトリを追加
-l リンカでライブラリファイルをリンクする
gcc -L./ -lhoge

./フォルダをライブラリ検索パスに追加し、hogeライブラリをリンクする

Make自動変数

変数 意味
$@ ターゲットのファイル名
$< 最初の依存関係の名前
$^ 全依存関係の名前を空白で挟んで並べたもの

標準Cライブラリ

標準C++ライブラリ

libstdc++が元々gccで使われていた。
ver4.2.1以降、GPL3になったことによりgcc以外のコンパイラでlibstdc++を使うとGPL適応になった。
それは不便だということでlibc++が作られた。

  • Linux: libstdc++
  • OS X(before Marvericks): libstdc++
  • OS X(after Marvericks): libc++
参照

c++ - When is it necessary to use use the flag -stdlib=libstdc++? - Stack Overflow

コンパイルとリンクについて

  • コンパイラは人間が理解できるソースコードから、機械が理解できるオブジェクトファイルを作る
  • オブジェクトファイルの中身は以下で構成される
  • 宣言とは、ソースのどこかにその定義がある、ということをコンパイラに伝えることである. 実際にその通りかどうか確認する(空いてるところに埋める)のはリンカの役目である

オブジェクトファイル

$ nm main.o

でオブジェクトファイルを調べる

大文字がグローバル
小文字がローカル

  • U: 未定義
  • D: 初期化されたデータセクション(.data)
  • B: 初期化されてないデータセクション(.bss)
  • T: 普通の定義

スタティックライブラリは未定義のシンボルだけを取り込む
ダイナミックライブラリは全部取り込む

参照

Beginner's Guide to Linkers