2009-07-17 2 views
15

У меня есть общий объект (так - эквивалент Linux для Windows dll), который я бы хотел импортировать и использовать с моим тестовым кодом.Как загрузить общий объект в C++?

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

#include "headerforClassFromBlah.h" 

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

    ClassFromBlah a; 
    a.DoSomething(); 
} 

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

+0

Возможно, я запутался, но вы не похожи на то, что у вас там достаточно информации. Что, например, содержит blah.so? Вы уверены, что не просто говорите об использовании ссылки? – Goz

+0

Что вы подразумеваете под «общим»? – Klaim

+0

Err ... поэтому файлы не являются файлами кода, не так ли? Возможно, вы хотите получить объект из a.так что (совместно используемая библиотека)? – Klaim

ответ

33

Есть два способа загрузки разделяемых объектов 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 man page Процесс под окнами или любая другая платформа та же, просто замените dlopen с версией платформы поиска динамического символа.

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

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

+5

+1. Возможно, стоит упомянуть, что dlopen - это POSIX, а не C или C++. На некоторых платформах нет динамической загрузки, но они все еще соответствуют реализациям на C++. –

+0

Что такое команда для создания этого файла, будет ли g ++ filename.cpp -L someIncludes -0 работать с файлом? – 2009-07-17 13:30:23

+0

Вам нужно будет использовать ссылку -ldl слишком –

4

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

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

3

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

g++ myfile.cpp -lblah 

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

+0

Я включил заголовки, и я могу скомпилировать и связать свой код с общим объектом, но я понятия не имею, как его использовать и какие классы он содержит. Я не делал этого ясно, см. Мое обновление для фрагмента кода. Любые идеи? –

+1

Что касается использования классов, которые он содержит, вы должны RTFM, я боюсь. – 2009-07-17 09:15:51

+0

@neil Это, вероятно, решение, в котором Бен нуждается ... Ответ на dlopen может быть просто неверным истолкованием вопроса о новичке (Ben?) ... @Ben L: Если вы не знаете, что находится в. поэтому у вас будет проблема с использованием dlsym ;-) – neuro

0

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