1、动态库的编写和编译
(1)编写外部接口的时候必须添加 “extern “C” ”
如:
#define STDCALL __attribute__((__stdcall__))
extern "C"
{
int STDCALL init(const TCHAR *dbfile);
}
(2)编译成动态库
g++ -shared -fPIC -o libcommondll.so common.o
2、动态库的使用
(1)先使用 typedef 对要使用的函数起个别名
typedef int (*df_init)(const char *dbfile);
(2)加载动态库,主要使用两个函数
//打开动态库文件
void *hso = dlopen("./libcommondll.so", RTLD_LAZY);
//获取动态库中的函数地址
df_init dfInit = (df_init)dlsym(hso, "init");
例子(动态库):
common.h
#include <stdio.h>
#define STDCALL __attribute__((__stdcall__))
extern "C"
{
int STDCALL init(const TCHAR *dbfile);
}
common.cpp
#include "common.h"
int init(const TCHAR *dbfile)
{
printf("hello world!\n");
return 0;
}
例子(使用动态库):
test.cpp
#include <stdio.h>
#include <dlfcn.h>
int main()
{
typedef int (*df_init)(const char *dbfile);
//加载动态库
void *hso = dlopen("./libdfcommondll.so", RTLD_LAZY);
if(!hso)
{
printf("dlopen failed:%s\n", dlerror());
return 0;
}
//获取动态库中函数地址
df_init dfInit = (df_init)dlsym(hso, "init");
//调用动态库中函数
df_init (NULL);
return 0;
}