dlopen динамическая библиотека из статической библиотеки Linux Stack Overflow

У меня есть приложение linux, которое связывается со статической библиотекой (.a), и эта библиотека использует функцию dlopen для загрузки динамических библиотек (.so)

Если я скомпилирую статическую библиотеку как динамическую и свяжу ее с приложением, dlopen будет работать так, как ожидалось, но если я буду использовать ее, как описано выше, она не будет.

Разве статическая библиотека не может использовать функцию dlopen для загрузки общих библиотек?

Благодарю.

1

Решение

Там должно быть никаких проблем с тем, что вы пытаетесь сделать:

app.c:

#include "staticlib.h"#include "stdio.h"int main()
{
printf("and the magic number is: %d\n",doSomethingDynamicish());
return 0;
}

staticlib.h:

#ifndef __STATICLIB_H__
#define __STATICLIB_H__

int doSomethingDynamicish();

#endif

staticlib.c:

#include "staticlib.h"#include "dlfcn.h"#include "stdio.h"int doSomethingDynamicish()
{
void* handle = dlopen("./libdynlib.so",RTLD_NOW);
if(!handle)
{
printf("could not dlopen: %s\n",dlerror());
return 0;
}

typedef int(*dynamicfnc)();
dynamicfnc func = (dynamicfnc)dlsym(handle,"GetMeANumber");
const char* err = dlerror();
if(err)
{
printf("could not dlsym: %s\n",err);
return 0;
}
return func();
}

dynlib.c:

int GetMeANumber()
{
return 1337;
}

и построить:

gcc -c -o staticlib.o staticlib.c
ar rcs libstaticlib.a staticlib.o
gcc -o app app.c libstaticlib.a -ldl
gcc -shared -o libdynlib.so dynlib.c

Первая строка создает библиотеку
вторая строка упаковывает его в статическую библиотеку
третье — сборка тестового приложения, связывание с недавно созданной статической версией, плюс библиотека динамической компоновки linux (libdl)
четвертая строка создает динамически загружаемую общую библиотеку.

выход:

./app
and the magic number is: 1337
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]