C动态加载库

时间:2014-04-07 22:07:18

标签: c

我有这样的代码

    #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方法的文件中?

1 个答案:

答案 0 :(得分:1)

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