我有这样的代码
#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;
}
和初始化方法有效,但是当我尝试使用allocate方法时,我收到错误 符号查找错误:/usr/local/lib/libarray.so:undefined symbol:add
我在来自memory.h的allocate方法中使用这个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;
}
如何解决?它可能会失败,因为我没有动态地将库加载到包含allocate方法的文件中?
答案 0 :(得分:1)
加载RTLD_GLOBAL
时,您需要使用标记libmemory.so
,以便其中的符号可供随后加载的库(例如libarray.so
)使用。默认情况下,库中的符号仅对该库可见,并且对使用该库的dlsym
调用可见。