Динамическое связывание в библиотеке C (lib * .so) - PullRequest
0 голосов
/ 02 октября 2010

Я написал код, в котором бы в качестве аргументов использовалась исполняемый файл и библиотека [lib * .so]. Ссылка @ Run-time.

Я также хочу взять функцию в файле (* .o) @ run-time и связать ее .Но я не знаю, как это сделать.

РЕДАКТИРОВАТЬ 1: Функция, которую я пытаюсь связать, является частью файла .o в библиотеке lib * .so, Итак, я хочу указать имя библиотеки, а также имя функции, которая находится в той же библиотеке @ 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 ]

1 голос
/ 02 октября 2010

Исходя из ваших комментариев, вы просто хотите добавить ссылку на свою общую библиотеку,

измените свой код на:

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 / для работы выше См. здесь для получения дополнительной информации.

1 голос
/ 03 октября 2010

Если вам нужно взять имя функции во время выполнения, вам нужно передать его в 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]);
1 голос
/ 02 октября 2010

Вы не можете загрузить перемещаемый объект (*.o) во время выполнения, используя стандартные функции. Вы должны убедиться, что объект скомпилирован как независимый от позиции код (например, -fPIC), а затем сделать из него общий объект. Что-то вроде ld -shared -o foo.so foo.o может помочь.

...