因项目需要多进程共享资源访问....
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. 总结
....