我正在尝试使用 Embarcaderos clang 32 位编译器编译 VTK (7.0) 库。
但是,我最后收到一个链接错误,如下所示:
[ 56%] Linking CXX shared library ..\..\bin\vtkCommonDataModel-7.0.dll
Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 Embarcadero Technologies, Inc.
bcc32c.exe: warning: argument unused during compilation: '-auto-dependency-output'
bcc32c.exe: warning: argument unused during compilation: '-sys-header-deps'
bcc32c.exe: warning: argument unused during compilation: '-nobuiltininc'
bcc32c.exe: warning: argument unused during compilation: '-Xclang -cxx-abi'
bcc32c.exe: warning: argument unused during compilation: '-Xclang borland'
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Error: Unresolved external 'vtkStdString::operator =(vtkStdString&&)' referenced from P:\BUILDS\CLANG32C\VTKFORK-NINJA\COMMON\DATAMODEL\CMAKEFILES\VTKCOMMONDATAMODEL.DIR\VTKDISTRIBUTEDGRAPHHELPER.CXX.OBJ
Error: Unresolved external 'vtkStdString::vtkStdString(vtkStdString&&)' referenced from P:\BUILDS\CLANG32C\VTKFORK-NINJA\COMMON\DATAMODEL\CMAKEFILES\VTKCOMMONDATAMODEL.DIR\VTKDATASETATTRIBUTES.CXX.OBJ
Error: Unable to perform link
vtkStdString 类派生自 std::string 并且非常简单
class vtkStdString : public std::string
{
public:
typedef std::string StdString;
typedef StdString::value_type value_type;
typedef StdString::pointer pointer;
typedef StdString::reference reference;
typedef StdString::const_reference const_reference;
typedef StdString::size_type size_type;
typedef StdString::difference_type difference_type;
typedef StdString::iterator iterator;
typedef StdString::const_iterator const_iterator;
typedef StdString::reverse_iterator reverse_iterator;
typedef StdString::const_reverse_iterator const_reverse_iterator;
vtkStdString(): StdString() {}
vtkStdString(const value_type* s): StdString(s) {}
vtkStdString(const value_type* s, size_type n): StdString(s, n) {}
vtkStdString(const StdString& s, size_type pos=0, size_type n=npos):
StdString(s, pos, n) {}
operator const char *() { return this->c_str(); }
};
不完全熟悉 cxx11(?) 我确实相信上面提到的链接器错误消息中未解析的函数被称为移动构造函数和移动赋值运算符。
尝试使用以下代码天真地将它们添加到 vtkStdString 类中
...
vtkStdString& operator=(vtkStdString&& rhs)
{
std::string::operator=(std::move(rhs));
return *this;
}
vtkStdString(vtkStdString&& s)
{//only trying to compile.. not final code! }
...
给出以下编译错误(修剪以显示重要内容):
In file included from vtkAbstractArray.cxx:31:
vtkStringArray.h:154:23: error: object of type 'vtkStdString' cannot be assigned because its copy assignment operator is implicitly deleted
{ this->Array[id] = value; this->DataChanged(); }
^
vtkStdString.h:56:19: note: copy assignment operator is implicitly deleted because 'vtkStdString' has a user-declared move constructor
vtkStdString::vtkStdString(vtkStdString&& s)
^
vtkAbstractArray.cxx:391:21: error: call to implicitly-deleted copy constructor of 'vtkStdString'
return vtkVariant(arr[index]);
关于如何克服这一问题有什么想法吗?
由于 VTK 是一个相当大的库,因此无法更改 vtkStdString 类的设计。