首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从dll对非成员运算符的未定义引用

从dll对非成员运算符的未定义引用
EN

Stack Overflow用户
提问于 2020-10-27 19:58:04
回答 1查看 97关注 0票数 2

对于一个赋值,我创建了一个分数类,它重载了许多运算符。然后,我将它转换成一个dll,供另一个程序使用。我遇到的问题是,当我尝试使用非会员操作符时,我会得到错误“未定义的对‘operator+’的引用”。

我相信我正确地实现了dll,因为构造函数和任何成员函数/运算符一样正确地工作。只是非会员运营商给了我这个问题。

代码语言:javascript
复制
        Fraction frac1(1,5); //No errors
        Fraction frac2(2,5); //No errors
        Fraction frac3 = frac2 + frac1; //ERROR: undefined reference to 'operator+'
        //Note: + operator is a non-member operator
        frac2 += frac1; //No errors and is a member operator

我一直试图解决这个问题,并搜索了几个小时,但没有成功。这可能是一个联系的问题,但我一直没有运气,如果是的话。

我正在使用Qt (因为我是在请求GUI)和MinGW。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-27 20:15:30

简短版本:您需要正确地导出/导入我们的库对象和代码。

长篇版本:

标题中的某个位置将有一个宏定义,类似于以下内容:

代码语言:javascript
复制
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(export)
#else
#define MYDLL_API __declspec(import)
#endif

这个宏稍后在头文件和实现文件中的不同位置使用。例如,一个简单的函数声明如下:

代码语言:javascript
复制
MYDLL_API int MyFunction(int);

或者作为另一个例子,也可以导出整个类及其成员:

代码语言:javascript
复制
class MYDLL_API MyClass
{
    // members...
};

在编译DLL (即构建实际DLL项目)时,预处理器宏MYDLL_EXPORTS是在主项目专用标头(而不是dll公开‘头)或实际构建命令中定义的。这反过来又使所有MYDLL_API装饰符号“导出”。例如,使用上面的API示例,如下所示:

代码语言:javascript
复制
MYDLL_API int MyFunction(int);

变成这样:

代码语言:javascript
复制
__declspec(dllexport) int MyFunction(int);

在使用标头和DLL导入库时,不要定义MYDLL_EXPORTS宏,而标题中的相同函数decl现在如下所示:

代码语言:javascript
复制
__declspec(dllimport) int MyFunction(int);

好的。这是大量的信息,或者最终归结到这个问题上。在DLL中有一个已声明但未导出的自由函数运算符.例如,考虑到上述所有情况,您有一个类Fraction,它可能如下所示:

代码语言:javascript
复制
class MYDLL_API Fraction
{
    // members
};

还有一个自由函数操作符,如下所示:

代码语言:javascript
复制
Fraction operator +(Fraction, Fraction);

后者应如下所示:

代码语言:javascript
复制
MYDLL_API Fraction operator +(Fraction, Fraction) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64561994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档