2

api.cpp:

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

到目前为止,一切都很好。

现在,我想制作一个标头,以便其他 cpp 文件也可以调用 theFunc。


Api.h:根据如何在头文件和 c 文件中声明函数指针?

extern int (*theFunc)(int);

/usr/bin/ld:警告:在 Api.o 中,符号“theFunc”的类型从 2 更改为 1

好的,所以这是一个警告,即 theFunc 被视为一个编译元素中的函数和另一个编译元素中的变量。 (参考)这似乎在运行时会发生不好的事情。

这似乎是一个正确的声明,我做错了什么?

编辑:实际上在 linux 中运行,所以使用 DlSym 而不是 Microsoft GetProcAddress() 调用

4

2 回答 2

0

根据链接的帖子,将其压缩为一行,而不是 .cpp 文件中的两行。所以 .h 似乎是正确的,并将其放入 .cpp 文件中:

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

您不会像链接的答案那样一次性进行声明和分配。有了我上面发布的内容,您将成为。

于 2012-04-18T21:04:30.467 回答
0

您可能不应该包含 Api.h

或者,您可以以 api.h 被 api.cpp 包含时的行为方式有所不同的方式使用宏。微软做过/做过这样的事情。

api.h

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

EXTERN int (*theFunc)(int);

api.cpp

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

其他.cpp

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