C++ 使用指向函数指针的外部引用时链接器警告
Api.cpp: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被视为一个编译元素中的函数,另一个编译元素中的变量。这似乎在运行时会发生不好的事情 这似乎是一个恰当
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函数名来加载。所以,它们可以是“跨平台”的。