未定义对 dll 中非成员运算符的引用
Undefined Reference to non-member operators from dll
对于一个赋值,我创建了一个分数 class 来重载许多运算符。然后我将它转换成一个 dll 以供另一个程序使用。我遇到的问题是,当我尝试使用非成员运算符时,出现错误“未定义对 'operator+'”的引用。
我相信我已经正确地实现了 dll,因为构造函数和任何成员一样工作正常 functions/operators。只有非会员运营商给我这个问题。
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 Creator(因为我正在实施 GUI)和 MinGW。
简短版本:您需要正确 export/import 我们的库 objects 和代码。
长版:
您的 header 中的某处将是类似于以下内容的宏定义:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(export)
#else
#define MYDLL_API __declspec(import)
#endif
此宏后来在 header 和实现文件中的多个地方使用。例如,一个简单的函数声明如下:
MYDLL_API int MyFunction(int);
或者作为另一个例子,整个 class 及其成员同样可以被导出:
class MYDLL_API MyClass
{
// members...
};
编译 DLL(即构建实际的 DLL 项目)时,预处理器宏 MYDLL_EXPORTS
定义在主 project-only header(不是 dll 暴露' header) 或实际的构建命令。这反过来又使所有 MYDLL_API
装饰符号“导出”。即,使用我们上面的 API 示例,这个:
MYDLL_API int MyFunction(int);
变成这样:
__declspec(dllexport) int MyFunction(int);
在使用 header 和 DLL 导入库时,不要定义 MYDLL_EXPORTS
宏,而 header 中的相同函数声明现在如下所示:
__declspec(dllimport) int MyFunction(int);
好的。这是很多信息,或者最终归结为这一点。您有一个 free-function 运算符在您的 DLL 中声明但未导出。 IE。综上所述,您的 class Fraction
可能如下所示:
class MYDLL_API Fraction
{
// members
};
还有一个 free-function 运算符,如下所示:
Fraction operator +(Fraction, Fraction);
后者应该是这样的:
MYDLL_API Fraction operator +(Fraction, Fraction)
对于一个赋值,我创建了一个分数 class 来重载许多运算符。然后我将它转换成一个 dll 以供另一个程序使用。我遇到的问题是,当我尝试使用非成员运算符时,出现错误“未定义对 'operator+'”的引用。
我相信我已经正确地实现了 dll,因为构造函数和任何成员一样工作正常 functions/operators。只有非会员运营商给我这个问题。
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 Creator(因为我正在实施 GUI)和 MinGW。
简短版本:您需要正确 export/import 我们的库 objects 和代码。
长版:
您的 header 中的某处将是类似于以下内容的宏定义:
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(export)
#else
#define MYDLL_API __declspec(import)
#endif
此宏后来在 header 和实现文件中的多个地方使用。例如,一个简单的函数声明如下:
MYDLL_API int MyFunction(int);
或者作为另一个例子,整个 class 及其成员同样可以被导出:
class MYDLL_API MyClass
{
// members...
};
编译 DLL(即构建实际的 DLL 项目)时,预处理器宏 MYDLL_EXPORTS
定义在主 project-only header(不是 dll 暴露' header) 或实际的构建命令。这反过来又使所有 MYDLL_API
装饰符号“导出”。即,使用我们上面的 API 示例,这个:
MYDLL_API int MyFunction(int);
变成这样:
__declspec(dllexport) int MyFunction(int);
在使用 header 和 DLL 导入库时,不要定义 MYDLL_EXPORTS
宏,而 header 中的相同函数声明现在如下所示:
__declspec(dllimport) int MyFunction(int);
好的。这是很多信息,或者最终归结为这一点。您有一个 free-function 运算符在您的 DLL 中声明但未导出。 IE。综上所述,您的 class Fraction
可能如下所示:
class MYDLL_API Fraction
{
// members
};
还有一个 free-function 运算符,如下所示:
Fraction operator +(Fraction, Fraction);
后者应该是这样的:
MYDLL_API Fraction operator +(Fraction, Fraction)