実装されていない関数が存在する共有ライブラリを作成することは可能ですか?
私は共有ライブラリ testDele.so を作成し、testDele.so 内のいくつかの関数を残して、他の人が実装できるようにしたいと考えています。たとえば、次のようになります。
- ライブラリ プロバイダーはファイルを作成します。
====== testDele.c ==============
#include <stdlib.h>
#include "testDele.h"
const DELE * DELE_Init( void * udata)
{
DELE * hnd = (DELE *) malloc(sizeof(DELE));
hnd->udata = udata;
hnd->fun = &priFun;
return hnd;
}
========== testDele.h ==============
extern int priFun(int a);
typedef int (*DELE_FUN)(int a);
typedef struct _dele
{
void * udata;
DELE_FUN fun;
} DELE ;
const DELE * DELE_Init( void * udata);
- USER-B がファイルを実装する
====== testDeleImp.c ===============
#inlucde "testDele.h"
#include <stdio.h>
int priFun(int a)
{
printf("testDele priFun:a=%d\n",a);
return 1;
}
====== testDeleMain.c =============
#include "testDele.h"
int main()
{
DELE * dele = DELE_Init(NULL);
dele->fun(20);
free (dele);
return 1;
}
次に、私(共有ライブラリプロバイダー)が共有ライブラリをコンパイルするとき
% gcc -shared -o libtestDele.so -fPIC testDele.c
以下のエラーが発生しました
================================================
Undefined symbols:
"_priFun", referenced from:
_priFun$non_lazy_ptr in cceJPWAA.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
このエラーは、実装されていない関数 priFunc が原因であることがわかっています。しかし、未定義のシンボルのリンクを防ぐ gcc のパラメーターはありますか?