C++ 对dll中非成员运算符的未定义引用

C++ 对dll中非成员运算符的未定义引用,c++,qt,mingw,qt-creator,C++,Qt,Mingw,Qt Creator,对于赋值,我创建了一个分数类,它重载了许多运算符。然后我把它转换成一个dll供另一个程序使用。我遇到的问题是,当我尝试使用非成员运算符时,会出现错误“未定义对‘运算符+’的引用” 我相信我已经正确地实现了dll,因为构造函数和任何成员函数/运算符都能正常工作。只有非成员运营商给了我这个问题 Fraction frac1(1,5); //No errors Fraction frac2(2,5); //No errors Fraction frac3

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

我相信我已经正确地实现了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 Creator(因为我正在实现一个GUI)和MinGW。

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


长版本:

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

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(export)
#else
#define MYDLL_API __declspec(import)
#endif
该宏稍后会在头文件和实现文件中的多个位置使用。例如,一个简单函数的声明如下:

MYDLL_API int MyFunction(int);
__declspec(dllimport) int MyFunction(int);
class MYDLL_API Fraction
{
    // members
};
Fraction operator +(Fraction, Fraction);
MYDLL_API Fraction operator +(Fraction, Fraction) 
或者,作为另一个示例,同样可以导出整个类及其成员:

class MYDLL_API MyClass
{
    // members...
};
编译DLL(即构建实际DLL项目)时,预处理器宏“
MYDLL\u EXPORTS
”在仅主项目标头(而不是DLL expose”标头)或实际构建命令中定义。这反过来使所有
MYDLL\u API
装饰符号“导出”。即,使用上面的API示例,这:

MYDLL_API int MyFunction(int);
变成这样:

__declspec(dllexport) int MyFunction(int);
在使用标头和DLL导入库时,不要定义
MYDLL\u EXPORTS
宏,因此标头中的相同函数decl现在如下所示:

MYDLL_API int MyFunction(int);
__declspec(dllimport) int MyFunction(int);
class MYDLL_API Fraction
{
    // members
};
Fraction operator +(Fraction, Fraction);
MYDLL_API Fraction operator +(Fraction, Fraction) 
嗯。这是很多信息,或者说最终归结到这一点。您有一个在DLL中声明但未导出的自由函数运算符。也就是说,鉴于上述所有情况,您有一个类
分数
,可能如下所示:

MYDLL_API int MyFunction(int);
__declspec(dllimport) int MyFunction(int);
class MYDLL_API Fraction
{
    // members
};
Fraction operator +(Fraction, Fraction);
MYDLL_API Fraction operator +(Fraction, Fraction) 
还有一个自由函数运算符,如下所示:

MYDLL_API int MyFunction(int);
__declspec(dllimport) int MyFunction(int);
class MYDLL_API Fraction
{
    // members
};
Fraction operator +(Fraction, Fraction);
MYDLL_API Fraction operator +(Fraction, Fraction) 
后者应如下所示:

MYDLL_API int MyFunction(int);
__declspec(dllimport) int MyFunction(int);
class MYDLL_API Fraction
{
    // members
};
Fraction operator +(Fraction, Fraction);
MYDLL_API Fraction operator +(Fraction, Fraction) 

您是否在类外运算符前面添加了_declspec(导出)/_declspec(导入)?我没有,我以前从未听说过。我会简单地执行frac2\uu declspec(导入)+frac1吗@如果您想将函数或类公开给dll,您必须用declspec“标记”它们。如果希望链接器知道头文件中的符号将来自.dll,则相同。有关教程,请参见此链接