PaperHouse で C のライブラリをコンパイルする

1 はじめに

前回では PaperHouse を使えば簡単に C から実行ファイルをコンパイルできることを説明しました.なんと実行ファイルのほかにも, PaperHouse を使えばライブラリ (スタティックライブラリや共有ライブラリ) も同様に簡単にコンパイルできます.

2 スタティックライブラリを作る

スタティックライブラリを作るときの面倒臭さって, .a ファイルを作るための gcc のオプションやコマンド (ar と ranlib) がすぐに思い出せないことです.

PaperHouse::StaticLibraryTask はスタティックライブラリをコンパイルするための rake タスクです.PaperHouse::ExecutableTask と同じく単純なインタフェースで,gcc のオプションやコマンドを知らなくとも簡単にスタティックライブラリをコンパイルできます.

次の例は hello.c から libhello.a をコンパイルする Rakefile の例です.何もむずかしいことはありません.

PaperHouse::StaticLibraryTask.new :libhello do |task|
  task.sources = 'hello.c'
end

rake libhello で libhello.a をコンパイルできます.必要なコマンドが自動的に呼び出されていることが分かります.

$ rake libhello
gcc -H -fPIC -I. -c hello.c -o ./hello.o
ar -cq ./libhello.a ./hello.o
ranlib ./libhello.a

PaperHouse::ExecutableTask と組み合わせれば,こうしてできたスタティックライブラリに実行ファイルをリンクするのも簡単です.

task :hello => :libhello

PaperHouse::ExecutableTask.new :hello do |task|
  task.ldflags = '-L.'
  task.sources = 'main.c'
end

PaperHouse::StaticLibraryTask.new :libhello do |task|
  task.sources = 'hello.c'
end

これを Makefile で書くとなると,少し本気を出さなければいけません.でも PaperHouse を使えばこのようにとてもお手軽です.

3 共有ライブラリを作る

共有ライブラリは PaperHouse::SharedLibraryTask です.スタティックライブラリと違って共有ライブラリではファイル名にバージョン番号が必須なので,.new の第二引数にバージョン番号を渡してください.

PaperHouse::SharedLibraryTask.new :libhello, '0.1.0' do |task|
  task.sources = 'hello.c'
end

rake libhello を実行してみましょう.

$ rake libhello
gcc -H -fPIC -I. -c hello.c -o ./hello.o
gcc -shared -Wl,-install_name,libhello.so.0 -o ./libhello.so.0.1.0 ./hello.o

何も考えなくても libhello.so.0.1.0 ができました.これで共有ライブラリでもスタティックライブラリでも何でも来いです.

4 おわりに

PaperHouse でスタティックライブラリと共有ライブラリをコンパイルする方法を紹介しました.次回は,Ruby の C 拡張モジュールをコンパイルする方法です.

Tagged ,

Leave a Reply