【发布时间】:2016-05-03 02:47:33
【问题描述】:
我在 (VC++ 2013) DLL 中定义了一个 << 运算符重载,可以正常编译:
定义:
__declspec(dllexport) friend std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
实施:
std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs)
{
os << rhs.toString();
return(os);
}
该dll包含另外50个方法,包括多个运算符重载,可以很好地编译和链接。
但是,使用dll的程序无法链接的方法
它将<< 重载声明为
__declspec(dllimport) std::ostream& operator<< (std::ostream& os, const ComplexMessage& rhs);
代码编译良好。但它不会链接:
错误 LNK2001:无法解析的外部符号“__declspec(dllimport) 类 std::basic_ostream > & __cdecl 消息传递::操作符 &,类消息传递::ComplexMessage const &)"
所有其他 DLL 方法链接正常。有谁知道为什么会发生此链接器错误?
编辑 这与建议的重复问题不同。符号在 DLL 的代码中定义并在语法上编译;但是,它没有链接。这向我表明,要么没有生成特定 operator
【问题讨论】:
-
如果您在两个位置都指定了未命名的命名空间
::operator<<,可能会发现一些问题。我见过的一个问题是命名空间中的原型,以及另一个/无中的定义。这不会产生编译错误。 (不过可能会发出警告。您是否筛选了所有警告?)需要明确的是,这不会解决问题,但可能有助于诊断。 -
使用 .h 文件来声明导出的函数。这样您就不会意外使用错误的命名空间名称。水晶球说在messaging中没有定义。
-
答案确实是命名空间,而不是类标识符。前缀“消息:;”给运营商(“messaging::operator
标签: c++ visual-c++ dll dllimport ostream