2

私は .so ライブラリを持っていて、それを実行nm -gCしています。

次のような出力が表示されます。

0011a011 W void my_fun< unsigned char>(unsigned char*, unsigned char, int)

インクルードできるヘッダーにはこの関数が含まれていませんが、cpp ファイルから呼び出したいと思います。

どうすればそれを行うことができますか?

4

4 に答える 4

5

含めることができるヘッダーには、この機能が含まれていません。

nmのマニュアルページから:

W

w

シンボルは、ウィーク オブジェクト シンボルとして明確にタグ付けされていないウィーク シンボルです。

だから、それは弱いシンボルです。ヘッダー ファイルで宣言されていない場合は、定義されていない可能性があります。場合によっては、自分で宣言して呼び出すこともできます (ライブラリにリンクする必要があります)。

void my_fun(unsigned char*, unsigned char, int);

// ...

my_fun(foo, bar, baz);

これが C++ 関数の場合、移植可能な方法で API を使用することはできません。dlopen()

于 2013-04-26T19:04:03.613 に答える
4
  1. ライブラリをロードするdlopen(3)
  2. で関数のアドレスを取得しdlsym(3)、適切な型の関数ポインタにキャストします
  3. 関数を呼び出す
  4. すべて完了したら、ライブラリを閉じますdlclose(3)
于 2013-04-26T19:02:25.563 に答える
1

新しい友達に会います:

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されます。.somain.cpp

g++ main.cpp -L. -lmyProgram
于 2013-04-26T19:03:15.557 に答える
1

メソッドを宣言するだけです

void my_fun(unsigned char*, unsigned char, int);

そして、それを使用/呼び出してみてください。基本的に、独自の (暗黙的な) ヘッダーを作成します。もちろん、ライブラリで定義されているシンボルに依存します。

于 2013-04-26T19:04:02.783 に答える