Linuxにおける動的ライブラリの使用方法
.so ライブラリのBuild方法
gcc -fPIC -c libhello.c -o libhello.lo gcc -shared -Wl,-soname,libhello.so libhello.lo -o libhello.so
呼び出し側のコンパイル&リンク
gcc -c -o call.o call.c
gcc -o call -L. -lhello call.o
以下、ソースコード
----------------------------------
<ライブラリ側>
----------------------------------
■ hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
typedef struct {
unsigned int data1;
unsigned int data2;
}STRUCT_TEST_TAB;
void say();
#endif
----------------------------------
■ hello.c
#include <stdio.h>
#include "hello.h"
STRUCT_TEST_TAB gData;
void say() {
gData.data1 = 0;
gData.data2 = 1;
printf("Hello, World!\n");
main_cb(); /* 呼び出し側の関数をコール */
}
----------------------------------
<呼び出し側>
----------------------------------
■ call.c
#include <stdio.h>
/* 関数呼び出しだけなら .so 側のヘッダーは不要 */
#include "hello.h"
STRUCT_TEST_TAB dData_Main; /* so側で定義されている構造体参照 */
int main(int argc, char** argv) {
say(); /* soファイル側の関数コール */
return 0;
}
void main_cb() {
printf("Main Callback! \n");
}
----------------------------------
※ libhello.so は /usr/lib に置く。 (他に置く場合はLIBPATHを通す)
※ ldconfig /usr/lib でシステムに認識させること。 これをやらないとなる。
./call: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
ライブラリが正しく動作すると
Hello, World!
Main Callback!