【发布时间】:2015-05-24 16:43:26
【问题描述】:
我正在尝试调用 C++ 类的静态链接静态方法,但我收到 VS 链接器错误 LNK2019,“未解析的外部符号”。这是库源代码:
// in header file
#define DllExport __declspec (dllexport)
class MyClass{
public:
DllExport
static HWND WINAPI myFunc();
};
// in cpp file
DllExport
HWND WINAPI MyClass::myFunc(){ /* create a GUI window that has instance of MyClass set as its property (using ::SetProp) */ }
myFunc 用作创建 MyClass 对象的入口点,该对象隐藏在库中。只有这样的静态函数才能用于影响 MyClass 实例的功能(通过提供相应的 HWND)。 这是图书馆使用者:
#define DllImport __declspec(dllimport)
DllImport
HWND WINAPI myFunc();
...
int main(){
HWND hWnd=myFunc();
... // work with the window and attached MyClass instance
}
(我相信)所有文件链接都设置正确 - 最初,myFunc 被设计为独立函数并且一切正常。我怀疑一定是某些调用对流不匹配导致链接器在 myFunc 上产生错误。 阅读有关该主题的多篇文章,即
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
和
https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
但他们没有解决我的问题。
感谢您的建议!
【问题讨论】:
-
您的静态方法是动态链接的。您的导出端很好,因此使用 DLL 的项目是罪魁祸首。确保包含整个类定义和相应的 __declspec(dllimport)。如果您使用
API宏,该宏在定义预处理器指令(例如:BUILDING_LIB)时配置为导出并导入,则更容易,这样您就可以在两个项目中包含相同的标头。 -
还要确保链接到存根库,尽管我假设您已经这样做了,因为您无需手动查找符号即可使独立功能正常工作。
-
好吧,我很确定我是静态链接(生成 LIB 而不是 DLL)。但是令我困惑的是,即使在 MyClass 中除了静态函数之外没有其他公开的函数(我认为静态函数实际上是经典的 C++ 函数),也必须包含整个 MyClass 定义。从我的角度来看,函数的主体“知道”要做什么(无论编译的指令是来自过程代码还是面向对象的代码),所以我现在缺少包含整个类声明的理由。
-
顺便说一句,刚刚尝试了你的建议,最后 IntelliSense 抱怨“不允许不完整的类型”,指的是我尝试在消费应用程序中调用 MyClass::myFunc()。
-
哎呀,现在我可以看到混乱了 - 我将此线程命名为“动态链接”。拜托,这个功能真的是静态链接的! (不知道我写的时候在想什么!)
标签: c++ winapi static-methods static-linking