Как использовать разделяемые библиотеки в статической библиотеке, не заставляя конечных пользователей ссылаться на них?
Допустим, я работаю над статической библиотекой 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, но...