Как загрузить общий объект в С++?
У меня есть общий объект (так - эквивалент Linux для dll Windows), который я бы хотел импортировать и использовать с моим тестовым кодом.
Я уверен, что это не так просто;) но это именно то, что я хотел бы сделать.
#include "headerforClassFromBlah.h"
int main()
{
load( "blah.so" );
ClassFromBlah a;
a.DoSomething();
}
Я предполагаю, что это действительно основной вопрос, но я не могу найти ничего, что выпрыгивает на меня в Интернете.
Ответы
Ответ 1
Существует два способа загрузки общих объектов в С++
Для любого из этих методов вам всегда понадобится файл заголовка для объекта, который вы хотите использовать. Заголовок будет содержать определения классов или объектов, которые вы хотите использовать в своем коде.
Статически:
#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.
Есть несколько слов Здесь о том, когда использовать статические и когда использовать динамическое связывание.
Ответ 2
Это зависит от платформы. Чтобы сделать это во время выполнения, в Linux вы используете dlopen, в окнах вы используете LoadLibrary.
Чтобы сделать это во время компиляции, в окнах вы экспортируете имя функции, используя dllexport и dllimport. В linux gcc экспортирует все общедоступные символы, поэтому вы можете просто подключиться к нему и вызвать функцию. В обоих случаях обычно требуется, чтобы у вас было имя символа в файле заголовка, затем #include
, затем вы связываетесь с библиотекой, используя возможности вашего компилятора.
Ответ 3
Вам нужно # включить любые заголовки, связанные с разделяемой библиотекой, чтобы получить объявления таких вещей, как ClassFromBlah. Затем вам нужно связать с .so - именно то, как вы это делаете, зависит от вашего компилятора и общей установки, но для g++ что-то вроде:
g++ myfile.cpp -lblah
вероятно, будет работать.
Ответ 4
Это ссылка на файл архива, подобный libblah.a, или если вы добавите -PIC в gcc, вы получите файл libblah.so 'shared Object' (это компоновщик, который его создает).
У меня однажды был SUN, и я создал такие типы файлов.
Файлы могут иметь номер версии, который должен быть точным или более высоким (код может быть изменен из-за ошибки). но вызов с параметрами должен быть таким же, как и выход.