C++コンパイラ使い方
オブジェクトファイル、静的ライブラリ、共有ライブラリ、静的リンク、動的リンクの整理。以下はMacで実施した。linuxでも多分同じはず。
使うソースファイル
- test.cpp
#include <iostream> #include "func.h" using namespace std; int main(){ func(); return 0; }
- func.h
#ifndef FUNC_H #define FUNC_H void func(); #endif
- func.cpp
#include <iostream> #include "func.h" using namespace std; void func(){ cout << "hello!" << endl; }
実行ファイルを作成
g++ test.cpp func.cpp
プリプロセス、コンパイル、アセンブル、リンクまで全部する。 -oオプションで出力される実行ファイル名を指定できる。 指定しなければ、a.outになる。
オブジェクトファイル(xxx.o)の作成
g++ -c test.cpp g++ -c func.cpp
-cオプションを使う。 プリプロセス、コンパイル、アセンブルまでする。
g++ -c test.cpp func.cpp
2つ同時もできる。
オブジェクトファイルをリンクして実行ファイル作成
g++ test.o func.o
オブジェクトファイルから静的ライブラリ(xxx.a)を作成
ar -r libfunc.a func.o
静的ライブラリはオブジェクトファイルの集合。(今回の例は1ファイルだけど。)
-rオプションは何なのかよく分かっていない。
静的ライブラリの名前はlib
静的ライブラリと静的リンクして実行ファイルを作成
g++ test.o -L./ -lfunc
-Lオプションで静的ライブラリの検索対象のディレクトリを追加をする。-lオプションで静的ライブラリを、libと拡張子(.a)を除いた名前で指定する。
g++ test.o libfunc.a
これでもできる。
共有ライブラリ(xxx.so)の作成
g++ -shared -fPIC -o libfunc.so func.cpp
-fPICはよくわかっていない。
共有ライブラリと動的リンクして実行ファイルを作成
g++ test.o -L./ -lfunc
静的リンクと同じコマンド。(静的ライブラリと共有ライブラリが同じ名前で両方ある場合は共有ライブラリが優先されるっぽい。普通は同じ名前にしないと思うけど。)
g++ test.o libfunc.so
これでもできる。