Как загрузить общий объект в C ++? - PullRequest
19 голосов
/ 17 июля 2009

У меня есть общий объект (так что Linux-эквивалент Windows DLL), который я хотел бы импортировать и использовать с моим тестовым кодом.

Я уверен, что это не так просто;) но это то, что я хотел бы сделать ..

#include "headerforClassFromBlah.h"

int main()
{
    load( "blah.so" );

    ClassFromBlah a;
    a.DoSomething();
}

Я предполагаю, что это действительно базовый вопрос, но я не могу найти ничего, что бросается в глаза при поиске в Интернете.

Ответы [ 4 ]

40 голосов
/ 17 июля 2009

Существует два способа загрузки общих объектов в C ++

Для любого из этих методов вам всегда понадобится заголовочный файл для объекта, который вы хотите использовать. Заголовок будет содержать определения классов или объектов, которые вы хотите использовать в своем коде.

Статический:

#include "blah.h"
int main()
{
  ClassFromBlah a;
  a.DoSomething();
}

gcc yourfile.cpp -lblah

Динамически (в Linux):

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
    void *handle;
    double (*cosine)(double);
    char *error;
    handle = dlopen ("libm.so", RTLD_LAZY);
    if (!handle) {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
    }
    printf ("%f\n", (*cosine)(2.0));
    dlclose(handle);
    return 0;
}

* Украдено с Справочная страница Linux dlopen Процесс под windows или любой другой платформой такой же, просто замените dlopen версией платформы динамического поиска символов.

Чтобы динамический метод работал, все символы, которые вы хотите импортировать / экспортировать, должны иметь внешнюю связь C.

Здесь есть несколько слов Здесь о том, когда использовать статическое и когда использовать динамическое связывание.

5 голосов
/ 17 июля 2009

Это зависит от платформы. Чтобы сделать это во время выполнения, в Linux вы используете dlopen , в Windows вы используете LoadLibrary .

Чтобы сделать это во время компиляции, в Windows вы экспортируете имя функции, используя dllexport и dllimport . В Linux gcc экспортирует все открытые символы, поэтому вы можете просто ссылаться на них и вызывать функцию. В обоих случаях, как правило, для этого требуется, чтобы у вас было имя символа в заголовочном файле, который вы затем #include, а затем вы ссылаетесь на библиотеку, используя возможности вашего компилятора.

3 голосов
/ 17 июля 2009

Вам нужно # включить любые заголовки, связанные с разделяемой библиотекой, чтобы получить описания таких вещей, как ClassFromBlah. Затем вам нужно связать с .so - как именно это сделать, зависит от вашего компилятора и общей установки, но для g ++ что-то вроде:

g++ myfile.cpp -lblah

, вероятно, будет работать.

0 голосов
/ 10 июля 2017

Это -l, который связывает архивный файл, такой как libblah.a, или, если вы добавите -PIC к gcc, вы получите файл 'shared Object' libblah.so (это компоновщик, который его создает) Однажды у меня было СОЛНЦЕ, и я собирал файлы такого типа. Файлы могут иметь номер редакции, который должен быть точным или большим (код мог измениться из-за ошибки). но вызов с параметрами должен совпадать с выводом.

...