Как использовать разделяемые библиотеки в статической библиотеке, не заставляя конечных пользователей ссылаться на них?

Допустим, я работаю над статической библиотекой foo.a, который использует функцию в bar.so,

Как мне построить эту библиотеку таким образом, чтобы любой, кто использует foo.a в их проекте не нужно явно ссылаться на bar.so?

2 ответа

Решение

Что вы можете сделать в libfoo.a это позвонить dlopen динамически связать libbar.so, Затем используйте dlsym чтобы найти функцию, которую вы хотите использовать.

typedef void (*BarFunctionType) (const char *);
FunctionType barFunction;

void initialize_foo_lib () {
    void *h = dlopen("libbar.so", RTLD_LAZY);
    BarFunctionType barFunction = (BarFunctionType) dlsym(h, "barFunction");
    // Note scary looking cast to get your function pointer.
    //... rest of code can call barFunction now
}

libbar.so должна быть библиотека C, или функция должна быть extern "C" если библиотека C++, для вас правильно найти имя функции. В противном случае вам нужно будет изменить название, чтобы найти функцию с dlsym, Ты можешь использовать objdump -T в библиотеке, чтобы проверить, не искажены ли имена в библиотеке.

Поймите, что есть еще зависимость от libbar.so, но он запекается в вашей статической библиотеке. Таким образом, пользователь libfoo.a не нужно добавлять -lbar на линию связи, когда они ссылаются в -lfoo,

Судя по расширениям, вы ищете способ Unix; насколько мне известно, и g++, и clang++ не могут этого сделать.

Visual C++, вероятно, может это сделать - я использовал его только для статических библиотек, а не для DLL, но...

Другие вопросы по тегам