2010-10-02 129 views
0

我已经写了一个代码,其中的可执行文件和[lib * .so]库作为我的参数和link @ Run-time。C(lib * .so)库中的动态链接

我也想参加的功能的(*的.o)文件@运行时间,并将其链接。 但我不知道如何去做。

编辑1: 我试图链接的函数是lib * .so库中.o文件的一部分。 所以我想指定库名称以及同一个库@ Run-Time中的函数名称。

例如,如果我的库包含两个函数(即* .o文件),则链接器应该编译我想要使用@ Run-Time的函数。

我已经发布的代码,请大家帮忙:

#include <stdio.h> 
#include <unistd.h> 
#include <dlfcn.h> // use -ldl 

typedef float (*DepFn)(short, short); 

int main(int argc, char* argv[]) 
{ 
    void* lib; 
    DepFn df; 

    if(argc < 2) 
     return printf("USAGE: %s lib-file\n", argv[0]); 

    lib = dlopen(argv[1], RTLD_NOW); 
    if(lib == NULL) 
     return printf("ERROR: Cannot load library\n"); 

    df = dlsym(lib, "Depreciation"); 
    if(df) 
    { 
     short l, i; 

     printf("Enter useful-life of asset: "); 
     scanf("%hd", &l); 

     for(i = 1; i <= l; i++) 
     { 
      float d = 100 * df(l, i); 
      printf("%hd\t%.1f%%\n", i, d); 
     } 
    } 
    else 
     printf("ERROR: Invalid library\n"); 

    dlclose(lib); 
} 
+0

该代码看起来很不错,那么究竟发生了什么?什么不工作?你是如何编译并链接你的libXXX.so的? – nos 2010-10-02 13:18:43

+0

@nos - 这工作正常。但我想知道如何在编译时加入函数。 – Pavitar 2010-10-02 13:25:53

回答

1

如果您需要在运行时采用函数名称,您需要将它传递给argv [2],而不是使用argv [2]在dlsym中对函数名称进行硬编码。

if(argc < 3) 
     return printf("USAGE: %s lib-file function-name\n", argv[0]); 

    lib = dlopen(argv[1], RTLD_NOW); 
    if(lib == NULL) 
     return printf("ERROR: Cannot load library\n"); 

    df = dlsym(lib, argv[2]); 
1

您不能加载使用标准功能在运行时可再定位(*.o)。您需要确保将对象编译为与位置无关的代码(例如-fPIC),然后从中创建共享对象。像ld -shared -o foo.so foo.o可能会伎俩。

+0

请检查编辑1 – Pavitar 2010-10-02 13:13:52

+0

Thankyou.I得到了你的观点:) – Pavitar 2010-10-02 13:24:21

1

根据您的意见,你只是想链接到您的共享库,你的代码

变化:

extern float Depreciation(short i,k); //should rather go in a header file 

int main(int argc, char* argv[]) 
{ 
    short l, i; 

     printf("Enter useful-life of asset: "); 
     scanf("%hd", &l); 

     for(i = 1; i <= l; i++) 
     { 
      float d = 100 * Depreciation(l, i); 
      printf("%hd\t%.1f%%\n", i, d); 
     } 
    } 

编译和链接到你的共享库:

gcc -o myprogram myprogram.c -lXX 

你的libXX.so需要安装在例如/ usr/lib /用于以上工作 有关更多信息,请参见here