私は .so ライブラリを持っていて、それを実行nm -gC
しています。
次のような出力が表示されます。
0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)
インクルードできるヘッダーにはこの関数が含まれていませんが、cpp ファイルから呼び出したいと思います。
どうすればそれを行うことができますか?
私は .so ライブラリを持っていて、それを実行nm -gC
しています。
次のような出力が表示されます。
0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)
インクルードできるヘッダーにはこの関数が含まれていませんが、cpp ファイルから呼び出したいと思います。
どうすればそれを行うことができますか?
含めることができるヘッダーには、この機能が含まれていません。
nmのマニュアルページから:
W
w
シンボルは、ウィーク オブジェクト シンボルとして明確にタグ付けされていないウィーク シンボルです。
だから、それは弱いシンボルです。ヘッダー ファイルで宣言されていない場合は、定義されていない可能性があります。場合によっては、自分で宣言して呼び出すこともできます (ライブラリにリンクする必要があります)。
void my_fun(unsigned char*, unsigned char, int);
// ...
my_fun(foo, bar, baz);
これが C++ 関数の場合、移植可能な方法で API を使用することはできません。dlopen()
dlopen(3)
dlsym(3)
、適切な型の関数ポインタにキャストしますdlclose(3)
新しい友達に会います:
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
ウィキペディアは、私が常に使用しているほとんどのプラットフォームの動的ライブラリ読み込みメカニズムを要約しています。
g++ -shared -fPIC myProgram.cpp -o libmyprogram.so
で使用する場合は、次のようにコンパイルmyProgram.cpp
されます。.so
main.cpp
g++ main.cpp -L. -lmyProgram
メソッドを宣言するだけです
void my_fun(unsigned char*, unsigned char, int);
そして、それを使用/呼び出してみてください。基本的に、独自の (暗黙的な) ヘッダーを作成します。もちろん、ライブラリで定義されているシンボルに依存します。