Есть два способа загрузки общих объектов в 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.
Есть несколько слов Здесь о том, когда использовать статическое, а когда - динамическое связывание.
Это зависит от платформы. Чтобы сделать это во время выполнения, в Linux вы используете dlopen , в Windows вы используете LoadLibrary .
Чтобы сделать это во время компиляции, в Windows вы экспортируете имя функции, используя dllexport и dllimport . В linux gcc экспортирует все общедоступные символы, поэтому вы можете просто связать его обычным образом и вызвать функцию. В обоих случаях обычно требуется, чтобы вы указали имя символа в файле заголовка, который затем #include
, а затем связываете с библиотекой с помощью средств вашего компилятора.
Вам необходимо # включить любые заголовки, связанные с разделяемой библиотекой, чтобы получить декларации таких вещей, как ClassFromBlah. Затем вам нужно выполнить ссылку на .so - как именно вы это делаете, зависит от вашего компилятора и общей установки, но для g ++, вероятно, будет работать что-то вроде:
g++ myfile.cpp -lblah
.