gpt4 book ai didi

C动态加载库

转载 作者:行者123 更新时间:2023-11-30 15:35:26 25 4
gpt4 key购买 nike

我有这样的代码

    #include <dlfcn.h>
#include <stdlib.h>
#include "timer.h"

#define SIZE 9000

void *memorylib;
void *arraylib;

typedef struct {
int rows;
int columns;
long **d;
} array;



int main(){

memorylib = dlopen("libmemory.so", RTLD_LAZY);
if(!memorylib){
exit(-1);
}
arraylib = dlopen("libarray.so",RTLD_LAZY);
if(!arraylib) {
exit(-1);
}

typedef void (*memory_initialize)(long);

typedef void * (*memory_add)(long);
typedef array *(*memory_allocate)(int,int);


memory_add add = (memory_add) dlsym(memorylib,"add");
memory_initialize initialize = (memory_initialize) dlsym(memorylib, "initialize");
memory_allocate allocate = (memory_allocate) dlsym(arraylib,"allocate");



initialize(SIZE*sizeof(int)/1024 + 1);

int rows = 10;
int columns = 10;
array *m = allocate(rows,columns);

dlclose(memorylib);
dlclose(arraylib);
return 0;
}

并且初始化方法有效,但是当我尝试使用分配方法时出现错误符号查找错误:/usr/local/lib/libarray.so: undefined symbol :添加

我在来自 memory.h 的分配方法中使用这个 add 方法

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

#include "array.h"
#include "memory.h"


array * allocate(int rows, int columns) {
// printf("%i",sizeof(array));
array *m = (array *) add(sizeof(array));
m->rows = rows;
m->columns = columns;
int i;
long **d = (long**)add(rows* sizeof(long*));
for(i=0;i< rows;i++) {
d[i] = (long *) add(columns * sizeof(long));
}
m->d = d;

return m;

}

如何解决?它可能会失败,因为我没有动态地将库加载到包含分配方法的文件中?

最佳答案

加载libmemory.so时需要使用标志RTLD_GLOBAL,以便后续加载的库(例如libarray)可以使用其中的符号.so)。默认情况下,库中的符号仅对该库以及使用该库的 dlsym 调用可见。

关于C动态加载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22924016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com