Chintech

自分があとで思い出す用。主に技術系。

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.aの形にしないといけない。(多分)

静的ライブラリと静的リンクして実行ファイルを作成

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

これでもできる。

githubコミット取り消し

web上でgithubのコミット操作するとgithubに登録しているメールアドレスが使われる。 本名が入っているガチメールアドレスなのでコミットを取り消したい。 web上では取り消せなさそうなので、ローカルで強制プッシュして取り消した。

  • ローカルでコミットを取り消す。(今回は直前のコミット。)
git reset HEAD^
  • 強制プッシュする。
git push -f