gpt4 book ai didi

c++ - 在 C++ 中调用静态链接的静态方法

转载 作者:太空狗 更新时间:2023-10-29 20:57:31 24 4
gpt4 key购买 nike

我正在尝试调用 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

但他们并没有解决我的问题。

感谢您的建议!

最佳答案

由于您的目标是创建静态库,我们要做的第一件事就是消除对 dllexport/dllimport 的任何提及。 .此类说明符仅在您实际创建 DLL 项目时使用。

所以对于 lib.h ,我们只需要这个(为了更好的措施添加了一些包含守卫):

// lib.h
#ifndef LIB_H
#define LIB_H

class MyClass{
public:
static void myFunc();
};

#endif

WINAPI规范也是不必要的,因为您是调用该方法的人,并且可以只使用默认调用约定而不会出现 ABI 问题(尽管如果您确实想使用 WINAPI,那么您需要在头文件中包含 <windows.h>) .

对于 lib.cpp ,我们只需要这个:

// lib.cpp
#include <Windows.h>
#include "lib.h"

void MyClass::myFunc(){
::MessageBox(0,"myFunc call!",NULL,0);
}

对于 main.cpp在你的app项目,我们只需要这个:

// main.cpp
#include <iostream>
#include <D:\staticlink\lib\lib.h>

int main(){
std::cout << "ahoj";
MyClass::myFunc();
char buf[10];
std::cin >> buf;
return 0;
}

我建议配置您的包含路径以查找 lib.h通过您的项目设置而不是在源代码中使用绝对路径,但也许您可以在一切正常后稍后再这样做。

在那之后,如果问题仍然存在,您唯一需要确保的就是您的 app项目正在链接 lib.lib正确(链接器设置)。

关于c++ - 在 C++ 中调用静态链接的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com