未定义对 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)