このブログを検索

2015/06/02

Linuxにおける動的ライブラリの使用方法


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!




0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。