dlopen动态库访问

因项目需要多进程共享资源访问....

1. 动态库源码、编译(DyncAppLib.cpp)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct {
	const char *pszItemName;
	int id;
}TItem;

typedef struct{
	const char *pszBankName;
	TItem *pTItem;
	int iNum;
}TBank;

typedef struct {
	TBank *pTBank;
}TBankCtrl;

static TItem g_TItem[] = {
	{"Item-a", 1},
	{"Item-b", 2},
	{"Item-c", 3},
	{"Item-d", 4},
	{"Item-e", 5},	
};


static TBank g_TBank[] = {
	{"BANK-a", g_TItem, sizeof(g_TItem)/sizeof(g_TItem[0])},
	{"BANK-b", g_TItem, sizeof(g_TItem)/sizeof(g_TItem[0])}
};

static TBankCtrl g_BankCtrl;

extern "C"{
	
	TBank *GetBank()
	{
		printf("GetBank was used.\n");
		return g_TBank;
	}
	
	TBankCtrl *GetBankCtrl()
	{
		g_BankCtrl.pTBank = g_TBank;
		return &g_BankCtrl;
	}
	
	
	int add(int a,int b)
	{
		printf("add was used.\n");
		return (a + b);
	}

	int sub(int a, int b)
	{
		printf("sub was used.\n");
		return (a - b);
	}

	int mul(int a, int b)
	{
		printf("mul was used.\n");
		return (a * b);
	}

	int div1(int a, int b)
	{
		printf("div1 was used.\n");
		return (a / b);
	}
}

交叉编译

arm-linux-gnueabi-g++ -fPIC -shared DyncAppLib.cpp  -o libDync.so 

2. 主源码编译编译

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>


//动态链接库路径
#define LIB_CACULATE_PATH "./libDync.so"


typedef struct {
	const char *pszItemName;
	int id;
}TItem;

typedef struct{
	const char *pszBankName;
	TItem *pTItem;
	int iNum;
}TBank;

typedef struct {
	TBank *pTBank;
}TBankCtrl;


//函数指针
typedef int (*CAC_FUNC)(int, int);
typedef TBank * (*CAC_FUNC_BANK)();
typedef TBankCtrl * (*CAC_FUNC_BANK_CTRL)();
int main(int argc, char *argv[])
{
    void *handle;
    char *error;
    CAC_FUNC cac_func = NULL;
	CAC_FUNC_BANK cac_func_bank = NULL;
	CAC_FUNC_BANK_CTRL cac_func_bank_ctrl = NULL;
	TBank *pTBank;
	TBankCtrl *pTBankCtrl;
	int idx, iBankIdx;
	

    //打开动态链接库
    handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY);
    if (!handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(EXIT_FAILURE);
    }

    //清除之前存在的错误
    dlerror();

    //获取一个函数
    *(void **) (&cac_func) = dlsym(handle, "add");
    if ((error = dlerror()) != NULL)  {
		fprintf(stderr, "%s\n", error);
		exit(EXIT_FAILURE);
    }
    printf("add: %d\n", (*cac_func)(2,7));

    cac_func = (CAC_FUNC)dlsym(handle, "sub");
    printf("sub: %d\n", cac_func(9,2));

    cac_func = (CAC_FUNC)dlsym(handle, "mul");
    printf("mul: %d\n", cac_func(3,2));

    cac_func = (CAC_FUNC)dlsym(handle, "div1");
    printf("div: %d\n", cac_func(8,2));
	
	#if 0
	cac_func_bank = (CAC_FUNC_BANK)dlsym(handle, "GetBank");
	pTBank = cac_func_bank();
	for (iBankIdx = 0; iBankIdx < 2; iBankIdx++)
	{
		for (idx=0; idx<pTBank[iBankIdx].iNum; idx++)
		{
			printf("BankName: %s, item: %s, id=%d\n", 
			pTBank[iBankIdx].pszBankName, pTBank[iBankIdx].pTItem[idx].pszItemName, pTBank[iBankIdx].pTItem[idx].id);	
		}
	}
	#endif
	
	cac_func_bank_ctrl = (CAC_FUNC_BANK_CTRL)dlsym(handle, "GetBankCtrl");
	pTBankCtrl = cac_func_bank_ctrl();

	for (iBankIdx = 0; iBankIdx < 2; iBankIdx++)
	{
		for (idx=0; idx<pTBankCtrl->pTBank[iBankIdx].iNum; idx++)
		{
			printf("BankName: %s, item: %s, id=%d\n", 
			pTBankCtrl->pTBank[iBankIdx].pszBankName, pTBankCtrl->pTBank[iBankIdx].pTItem[idx].pszItemName, pTBankCtrl->pTBank[iBankIdx].pTItem[idx].id);	
		}
	}
	

    //关闭动态链接库
    //dlclose(handle);
    exit(EXIT_SUCCESS);
}

交叉编译

arm-linux-gnueabi-gcc -o DyncAppTest DyncAppTest.c -ldl

3. 将动态库libDync.so和主应用DyncAppTest 下载到arm平台的同一级目录下,执行应用程序

root@nxbb:/mnt/# ./DyncAppTest 
add was used.
add: 9
sub was used.
sub: 7
mul was used.
mul: 6
div1 was used.
div: 4
BankName: BANK-a, item: Item-a, id=1
BankName: BANK-a, item: Item-b, id=2
BankName: BANK-a, item: Item-c, id=3
BankName: BANK-a, item: Item-d, id=4
BankName: BANK-a, item: Item-e, id=5
BankName: BANK-b, item: Item-a, id=1
BankName: BANK-b, item: Item-b, id=2
BankName: BANK-b, item: Item-c, id=3
BankName: BANK-b, item: Item-d, id=4
BankName: BANK-b, item: Item-e, id=5

结果验证ok,能正常使用动态库;

4. 主应用程序不修改,修改动态库的BANK配置数据如下

static TItem g_TItem[] = {
	{"Item-a", 1},
	{"Item-b", 2},
	{"Item-c", 3},
	{"Item-d", 4},
	{"Item-e", 5},
    
    //以下值是新增加的
	{"Item-f", 6},
	{"Item-g", 7},
	{"Item-h", 8},	
};
arm-linux-gnueabi-g++ -fPIC -shared DyncAppLib.cpp  -o libDync.so

将动态库下载到arm平台,替换第3中的libDync.so,然后运行应用程序

root@NXBB:/mnt# ./DyncAppTest 
add was used.
add: 9
sub was used.
sub: 7
mul was used.
mul: 6
div1 was used.
div: 4
BankName: BANK-a, item: Item-a, id=1
BankName: BANK-a, item: Item-b, id=2
BankName: BANK-a, item: Item-c, id=3
BankName: BANK-a, item: Item-d, id=4
BankName: BANK-a, item: Item-e, id=5
BankName: BANK-a, item: Item-f, id=6
BankName: BANK-a, item: Item-g, id=7
BankName: BANK-a, item: Item-h, id=8
BankName: BANK-b, item: Item-a, id=1
BankName: BANK-b, item: Item-b, id=2
BankName: BANK-b, item: Item-c, id=3
BankName: BANK-b, item: Item-d, id=4
BankName: BANK-b, item: Item-e, id=5
BankName: BANK-b, item: Item-f, id=6

结果验证ok,能正常运行。

5. 总结

....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值