gpt4 book ai didi

c++ - 如何从 dll 中导出 C++ 类?

转载 作者:IT老高 更新时间:2023-10-28 22:00:13 26 4
gpt4 key购买 nike

我有一个有两个重载函数的类。如何从 dll 导出它以及如何由其他 C++ 类使用它?我的类(class)是这样的:

#define DECLDIREXP __declspec(dllexport) 

#define DECLDIRIMP __declspec(dllimport)


class DECLDIREXP xyz

{

public:
void printing();
void printing(int a);
};

using namespace std;

void xyz::printing()
{
cout<<"hello i donot take any argument";
}


void xyz::printing(int a)
{
cout<<"hello i take "<< a <<"as argument";
}

最佳答案

一种常见的方法是使用单个宏(我们称之为 EXPORT),它可以扩展为 dllimportdllexport,具体取决于是否有设置了“立即构建 DLL”的定义,如下所示:

#ifdef MAKEDLL
# define EXPORT __declspec(dllexport)
#else
# define EXPORT __declspec(dllimport)
#endif

class EXPORT xyz {
// ...
};

这个想法是在构建 DLL 时,将 MAKEDLL 添加到预处理器定义中。这样,所有代码都将被导出。链接到您的 DLL(并因此包含此头文件)的客户端根本不需要做任何事情。通过不定义MAKEDLL,它们会自动导入所有代码。

这种方法的优势在于,正确处理宏的负担从众多(客户端)转移到了 DLL 的作者身上。

这样做的缺点是,当按原样使用上面的代码时,不再可能直接将代码编译到某个客户端模块中,因为不可能将 EXPORT 宏定义为空.为此,您需要进行另一项检查,如果为真,则将 EXPORT 定义为空。

关于一个稍微不同的主题:在许多情况下,不可能(或不希望!)导出这样的完整类。相反,您可能只想导出所需的符号。例如,在您的情况下,您可能只想导出两个公共(public)方法。这样,所有私有(private)/ protected 成员都不会被导出:

class xyz
{
public:
EXPORT void printing();
EXPORT void printing(int a);
};

关于c++ - 如何从 dll 中导出 C++ 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840576/

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