Как я загружаю общий объект в C++?

  1. Определенно сохраняют имена таблиц исключительными, человек не люди
    1. То же здесь
    2. номер. Я видел некоторые ужасные префиксы, идя, насколько заявить, что имело дело с, таблица (tbl _) или пользовательская процедура хранилища (usp _). Сопровождаемый именем базы данных... Не делайте этого!
    3. Да. Я ухаживаю к PascalCase за всеми своими именами таблиц
20
задан Ben L 17 July 2009 в 09:10
поделиться

3 ответа

Есть два способа загрузки общих объектов в 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;
}

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

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

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

40
ответ дан 29 November 2019 в 23:23
поделиться

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

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

5
ответ дан 29 November 2019 в 23:23
поделиться

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

g++ myfile.cpp -lblah

.

3
ответ дан 29 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: