Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指向函数指针的外部引用时链接器警告_C++_Function Pointers_Extern - Fatal编程技术网

C++ 使用指向函数指针的外部引用时链接器警告

C++ 使用指向函数指针的外部引用时链接器警告,c++,function-pointers,extern,C++,Function Pointers,Extern,Api.cpp: int (*theFunc) (int); theFunc = (int (*) (int)) DlSym(hSo, "theFunc"); 到目前为止还不错 现在,我想制作一个头文件,以便其他cpp文件也可以调用Func Api.h:per /usr/bin/ld:警告:Api.o中“theFunc”符号的类型从2更改为1 好的,这是一个警告,即Func被视为一个编译元素中的函数,另一个编译元素中的变量。这似乎在运行时会发生不好的事情 这似乎是一个恰当

Api.cpp:

int (*theFunc) (int);
theFunc = (int (*) (int)) DlSym(hSo, "theFunc");
到目前为止还不错

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


Api.h:per

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

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

这似乎是一个恰当的声明,我做错了什么


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

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

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

你不能像链接的答案那样一次性完成声明和赋值。根据我上面发布的内容,您将成为。

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

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

你不能像链接的答案那样一次性完成声明和赋值。有了我在上面发布的内容,您将成为。

您可能不应该包括Api.h

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

api.h

api.cpp

#define _API_
#include "api.h"
...
其他.cpp

#define _OTHER_
#include "api.h"
...

您可能不应该包括Api.h

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

api.h

api.cpp

#define _API_
#include "api.h"
...
其他.cpp

#define _OTHER_
#include "api.h"
...

添加
typedef
怎么样<代码>外部类型定义int(*theFunc)(int)添加
typedef
怎么样<代码>外部类型定义int(*theFunc)(int)我不能从变量定义中调用GetProcAddress,因为我只有在函数内部运行时才有dll的句柄,在我调用LoadLibrary()来“定义”这样的外部变量的位置之后,任何赋值都应该有效,所以可以尝试在.cpp文件中为该变量赋值NULL,然后“真的”稍后分配。定义不需要初始化。这甚至不是问题所在。变量已经定义,它显示,我可以很好地找到它objdump-t。问题是在其他编译单元中,extern int(*theFunc)(int);被视为函数声明,而不是指向函数的指针。我不能从变量定义中调用GetProcAddress,因为直到函数内部运行时,我才有dll的句柄。在我调用LoadLibrary()来“定义”这样的外部变量的位置之后,任何赋值都应该有效,因此,可以尝试在.cpp文件中为变量赋值NULL,然后在以后“真的”赋值。定义不需要初始化。这甚至不是问题所在。变量已经定义,它显示,我可以很好地找到它objdump-t。问题是在其他编译单元中,extern int(*theFunc)(int);被视为函数声明,而不是指向函数的指针。无论我是否包含Api.cpp中的Api.h,都会出现此警告。此外,使用您的定义会得到相同的结果(ld warn),并且我使用的是linux gcc,而不是MS,尽管我最初的帖子是这样写的。在更深处,我打电话给DlSym。这个第三方有一个愚蠢的包装器。因此,它使用MS函数名来加载。因此,它们可以是“跨平台”的。不管我是否从Api.cpp中包含Api.h,都会出现此警告。此外,使用您的定义会得到相同的结果(ld warn),并且我使用的是linux gcc,而不是MS,尽管我的原始帖子是这样写的。在更深处,我打电话给DlSym。这个第三方有一个愚蠢的包装器。所以它使用MS函数名来加载。所以,它们可以是“跨平台”的。