0

我编写了一个代码,其中将一个可执行文件和 [lib*.so] 库作为我的参数并链接@ Run-time。

我还想在 (*.o) 文件@run-time 中获取函数并将其链接。但我不知道该怎么做。

编辑 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);
}
4

3 回答 3

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/ 中才能使上述内容正常工作,请参阅此处了解更多信息。

于 2010-10-02T19:40:34.037 回答
1

您不能*.o在运行时使用标准函数加载可重定位 ( )。您需要确保将对象编译为与位置无关的代码(例如-fPIC),然后从中创建一个共享对象。类似的东西ld -shared -o foo.so foo.o可能会奏效。

于 2010-10-02T13:08:45.930 回答
1

如果需要在运行时获取函数名,则需要在 argv[2] 中传递它,而不是在dlsym使用 argv[2] 中硬编码函数名。

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]);
于 2010-10-03T05:16:54.493 回答