静的ライブラリ (.a) にリンクする Linux アプリケーションがあり、そのライブラリは dlopen 関数を使用して動的ライブラリ (.so) をロードします。
静的ライブラリを動的にコンパイルしてアプリケーションにリンクすると、dlopen は期待どおりに機能しますが、上記のように使用すると機能しません。
静的ライブラリは dlopen 関数を使用して共有ライブラリをロードできませんか?
ありがとう。
静的ライブラリ (.a) にリンクする Linux アプリケーションがあり、そのライブラリは dlopen 関数を使用して動的ライブラリ (.so) をロードします。
静的ライブラリを動的にコンパイルしてアプリケーションにリンクすると、dlopen は期待どおりに機能しますが、上記のように使用すると機能しません。
静的ライブラリは dlopen 関数を使用して共有ライブラリをロードできませんか?
ありがとう。
あなたがやろうとしていることに問題はないはずです:
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
最初の行は lib をビルドし
ます 2 番目の行はそれを静的 lib にパックします
3 番目はテスト アプリをビルドし、新しく作成された static にリンクし、加えて Linux 動的リンク ライブラリ (libdl) をリンクします
4 番目の行はすぐに動的にロードされる共有ライブラリをビルドします.
出力:
./app
and the magic number is: 1337