2012年2月23日木曜日

C言語と動的ローディングのメモ

.soファイルの作り方をメモしておく。
時々忘れて、汚いファイル群から検索するはめになるので・・・。
環境は、Ubuntu 10.04、CMake、gccですよ。
.soはshared objectの略である。
pythonとC++の連携などで必要になるらしいので・・・。(私は、Pythonは趣味以下のレベル)

共有ライブラリファイル(.so)の作り方
適当にプログラムを書く

(sampleSo.c)
#include
void function1()
{
  printf("function1\n");
}
void function2(int i)
{
  printf("%d function2\n",i);
}

(CMakeLists.txt)

cmake_minimum_required (VERSION 2.6)
project (sampleSo)
add_library(sampleSo SHARED sampleSo.c)

重要なのはCMakeLists.txtだけですけど・・・。

ビルドのための簡単なコマンドは、
cmake .
make -f Makefile

これで、libsampleSo.soというファイルが生成されるはずです。
とりあえずは、ここまでで良いと思いますよ。

以降は、これをCで使う場合です。

(main.c)
#include //動的ローディングのためのヘッダ
int main()
{
  int tmpValue = 5;
  void* handle = dlopen("./libsampleSo.so",RTLD_NOW);
  void (*func)() = dlsym(handle,"function1");  //関数ポインタ
  void (*func2)(int) = dlsym(handle,"function2");  //引数あり
  (*func)();
  (*func2)(tmpValue);
  dlclose(handle);
  return 0;
}

次に新たにCMakeファイルを書く
(CMakeLists.txt)
cmake_minimum_required (VERSION 2.6)

project (main)
SET(CMAKE_C_FLAGS "-ldl")
add_executable(main main.c)

ビルドはおなじみ
cmake .
make

実行させてみると
function1
5 function2
と出ているはず。
とりあえず、こんな感じ。