2

API.cpp:

int (*theFunc) (int);
theFunc = (int (*) (int)) DlSym(hSo, "theFunc");

ここまでは順調ですね。

ここで、他の cpp ファイルも theFunc を呼び出せるようにヘッダーを作成します。


Api.h: perヘッダーと c ファイルで関数ポインターを宣言する方法は?

extern int (*theFunc)(int);

/usr/bin/ld: 警告: Api.o でシンボル「theFunc」のタイプが 2 から 1 に変更されました

これは、theFunc が 1 つのコンパイル要素からは関数として、別の要素では変数として認識されるという警告です。 (参考)これは実行時に悪いことが起こりそうです。

これは適切な宣言のようですが、何が間違っていますか?

編集:実際にはLinuxで実行されているため、Microsoft GetProcAddress()呼び出しではなくDlSymを使用してください

4

2 に答える 2

0

リンクされた投稿によると、.cppファイルの2行ではなく、1行に要約してください。したがって、.hは正しいように見え、これを.cppファイルに入れます。

int (*theFunc) (int) = (int (*) (int)) GetProcAddress(hDll, "theFunc");

リンクされた答えのように、宣言と割り当てを一度に行うのではありません。私が上に投稿したもので、あなたはそうなるでしょう。

于 2012-04-18T21:04:30.467 に答える
0

おそらくApi.hを含めるべきではありません

または、api.cppに含まれている場合にapi.hの動作が多少異なる方法でマクロを操作することもできます。MicroSoftはそのようなことをしました/しました。

api.h

#ifdef _API_
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int (*theFunc)(int);

api.cpp

#define _API_
#include "api.h"
...

other.cpp

#define _OTHER_
#include "api.h"
...
于 2012-04-18T21:04:37.637 に答える