C(lib * .so)库中的动态链接

时间:2010-10-02 13:03:32

标签: c unix linker posix dynamic-linking

我编写了一个代码,其中包含可执行文件和[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);
}

3 个答案:

答案 0 :(得分:1)

您无法使用标准函数在运行时加载可重定位的(*.o)。您需要确保将对象编译为与位置无关的代码(例如-fPIC),然后从中创建共享对象。像ld -shared -o foo.so foo.o这样的东西可以解决问题。

答案 1 :(得分: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

答案 2 :(得分: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]);
相关问题