对于一个赋值,我创建了一个分数类,它重载了许多运算符。然后,我将它转换成一个dll,供另一个程序使用。我遇到的问题是,当我尝试使用非会员操作符时,我会得到错误“未定义的对‘operator+’的引用”。
我相信我正确地实现了dll,因为构造函数和任何成员函数/运算符一样正确地工作。只是非会员运营商给了我这个问题。
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。
发布于 2020-10-27 20:15:30
简短版本:您需要正确地导出/导入我们的库对象和代码。
长篇版本:
标题中的某个位置将有一个宏定义,类似于以下内容:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(export)
#else
#define MYDLL_API __declspec(import)
#endif这个宏稍后在头文件和实现文件中的不同位置使用。例如,一个简单的函数声明如下:
MYDLL_API int MyFunction(int);或者作为另一个例子,也可以导出整个类及其成员:
class MYDLL_API MyClass
{
// members...
};在编译DLL (即构建实际DLL项目)时,预处理器宏MYDLL_EXPORTS是在主项目专用标头(而不是dll公开‘头)或实际构建命令中定义的。这反过来又使所有MYDLL_API装饰符号“导出”。例如,使用上面的API示例,如下所示:
MYDLL_API int MyFunction(int);变成这样:
__declspec(dllexport) int MyFunction(int);在使用标头和DLL导入库时,不要定义MYDLL_EXPORTS宏,而标题中的相同函数decl现在如下所示:
__declspec(dllimport) int MyFunction(int);好的。这是大量的信息,或者最终归结到这个问题上。在DLL中有一个已声明但未导出的自由函数运算符.例如,考虑到上述所有情况,您有一个类Fraction,它可能如下所示:
class MYDLL_API Fraction
{
// members
};还有一个自由函数操作符,如下所示:
Fraction operator +(Fraction, Fraction);后者应如下所示:
MYDLL_API Fraction operator +(Fraction, Fraction) https://stackoverflow.com/questions/64561994
复制相似问题