在C ++ / CLI中使用unique_ptr时的链接器错误 [英] Linker error when using unique_ptr in C++/CLI

查看:188
本文介绍了在C ++ / CLI中使用unique_ptr时的链接器错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在将我的实例 auto_ptr 转换为 unique_ptr ,但我遇到了问题。它在代码的C ++部分很好,但是在我的托管C ++ / CLI层(该软件使用C#和C ++)时,我得到链接错误。它编译良好,但它在链接时间打破。从来没有任何问题与 auto_ptr



我目前使用Visual Studio 2010.有人知道任何在C ++ / CLI中使用 unique_ptr 的问题?



我试图总结一个下面的代码,但请注意,下面的代码实际上是编译和工作(我检查了指针的所有权正确移动)。我编译时没有链接错误,但下面的代码是纯C ++,而不是C ++ / CLI。我只是想有一个最小的例子如何构建代码,以便链接器错误更有意义阅读。

  #include stdafx.h
#include< vector>
#include< memory>
#include< utility>

using namespace std;

命名空间test {

template<类T>
struct LinAlgPoint3 {
LinAlgPoint3(){x = y = z = 0; };

union {
struct {T x,y,z;};
T data_ [3];
};
};

class ContainerClass
{
public:
void setUniquePtr(
unique_ptr< vector< LinAlgPoint3< float>> newUniquePtr1,
unique_ptr< vector< unsigned char>> newUniquePtr2)
{
m_uniquePtr1 = move(newUniquePtr1);
m_uniquePtr2 = move(newUniquePtr2);
}

private:
unique_ptr<载体, LinAlgPoint3< float> > > m_uniquePtr1;
unique_ptr<载体, unsigned char> > m_uniquePtr2;
};

int main(int argc,char ** argv)
{
auto pos = unique_ptr<载体, LinAlgPoint3< float> > >(new vector< LinAlgPoint3< float>>());
auto name = unique_ptr<载体, unsigned char> >(new vector< unsigned char>());
ContainerClass container;
container.setUniquePtr(move(pos),move(name));
}

} //命名空间测试

错误I链接时获取以下内容:

 错误LNK2028:未解析的标记(0A0018A5)private:__cdecl std :: unique_ptr< class std :: vector< struct LinAlgPoint3< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>,struct std :: default_delete< class std :: vector& struct LinAlgPoint3< float>>>>>> :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>,struct std :: default_delete ; class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>>>>(class std :: unique_ptr< class std :: vector< struct LinAlgPoint3& ,class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > > > > const&)(?? 0?$ unique_ptr @ V?$ vector @ U?$ LinAlgPoint3 @ M @ Test @@ V?$ allocator @ U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @ @U?$ default_delete @ V?$ vector @ U?$ LinAlgPoint3 @ M @ Test @@ V?$ allocator @ U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @@@@@ std @在函数public:static void __clrcall std :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>中引用的@ $$ FAEAA @ AEBV01 @ > >,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > > > > ::< MarshalCopy>(class std :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete& std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>> *,class std :: unique_ptr< class std :: vector< struct LinAlgPoint3& class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>> ;> *)(< MarshalCopy> @?$ unique_ptr @ V?$ vector @U?$ LinAlgPoint3 @ M @ Test @@ V $ $ allocator @U?$ LinAlgPoint3 @ M @ Test @@@ std @ @@ std @@ U?$ default_delete @ V?$ vector @ U?$ LinAlgPoint3 @ M @ Test @@ V $ $ allocator @ U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @@@ 2 @@ std @@ $$ FSMXPEAV12 @ 0 @ Z)
1> TestClass.obj:error LNK2028:未解析的令牌(0A0018A6)private:__cdecl std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > > :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > >(class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< ; unsigned char>>>> const&)(?? 0?$ unique_ptr @ V?$ vector @ EV?$ allocator @ E @ std @@@ std @@ U?$ default_delete @ V?$在函数public:static void __clrcall std :: unique_ptr中引用的向量@ EV?$ allocator @ E @ std @@@ std @@@ 2 @@ std @@ $$ FAEAA @ AEBV01 @@ Z) vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > > ::< MarshalCopy>(class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< class std :: vector< unsigned char ,class std :: allocator< unsigned char>>>> *,class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< ; class std :: vector< unsigned char,class std :: allocator< unsigned char>>> *)(?< MarshalCopy> @?$ unique_ptr @ V?$ vector @ EV?$ allocator @ E @std @@@ std @@ U?$ default_delete @ V?$ vector @ EV?$ allocator @ E @ std @@@ std @@@ 2 @@ std @@ $$ FSMXPEAV12 @ 0 @ Z)
1> TestClass.obj:error LNK2019:未解析的外部符号private:__cdecl std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > > :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > >(class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< ; unsigned char>>>> const&)(?? 0?$ unique_ptr @ V?$ vector @ EV?$ allocator @ E @ std @@@ std @@U?$ default_delete @ V?$在函数public:static void __clrcall std :: unique_ptr中引用的向量@ EV?$ allocator @ E @ std @@@ std @@@ 2 @@ std @@ $$ FAEAA @ AEBV01 @@ Z) vector< unsigned char,class std :: allocator< unsigned char> >,struct std :: default_delete< class std :: vector< unsigned char,class std :: allocator< unsigned char> > > > ::< MarshalCopy>(class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< class std :: vector< unsigned char ,class std :: allocator< unsigned char>>>> *,class std :: unique_ptr< class std :: vector< unsigned char,class std :: allocator< unsigned char>>,struct std :: default_delete< ; class std :: vector< unsigned char,class std :: allocator< unsigned char>>> *)(?< MarshalCopy> @?$ unique_ptr @ V?$ vector @ EV?$ allocator @ E @std @@@ std @@ U?$ default_delete @ V?$ vector @ EV?$ allocator @ E @ std @@@ std @@@ 2 @@ std @@ $$ FSMXPEAV12 @ 0 @ Z)
1> TestClass.obj:error LNK2019:未解析的外部符号private:__cdecl std :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > >,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > > > > :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > >,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > > > >(class std :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>> const&)(?? 0?$ unique_ptr @ V?$ vector @ U?$ LinAlgPoint3 @ M @ @@ V $ $ allocator @ U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @@ U?$ default_delete @ V?$ vector @ U?$ LinAlgPoint3 @ M @ Test @@ V?$ allocator @在函数public:static void __clrcall std :: unique_ptr< class std()中引用的U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @@@ 2 @@ std @@ $$ FAEAA @ AEBV01 @@ Z) :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float> > >,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3& > > > > ::< MarshalCopy>(class std :: unique_ptr< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete& std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>>> *,class std :: unique_ptr< class std :: vector< struct LinAlgPoint3& class std :: allocator< struct LinAlgPoint3< float>>>,struct std :: default_delete< class std :: vector< struct LinAlgPoint3< float>,class std :: allocator< struct LinAlgPoint3< float>>> ;> *)(< MarshalCopy> @?$ unique_ptr @ V?$ vector @U?$ LinAlgPoint3 @ M @ Test @@ V $ $ allocator @U?$ LinAlgPoint3 @ M @ Test @@@ std @ @@ std @@ U?$ default_delete @ V?$ vector @ U?$ LinAlgPoint3 @ M @ Test @@ V $ $ allocator @ U?$ LinAlgPoint3 @ M @ Test @@@ std @@@ std @@@ 2 @@ std @@ $$ FSMXPEAV12 @ 0 @ Z)
1> D:\Test\Test.dll:致命错误LNK1120:4未解析的外部
pre>

正如你可以看到的(如果你可以通过令人难以置信的可怕的消息)有一些引用MarshalCopy,使我担心C ++ / CLI可能不支持unique_ptr。



该软件的布局是

  - > C ++ / CLI翻译层(dll) - > C ++ dll 

所以C ++ dll使用unique_ptr编译得很好,但是C ++ / CLI dll无法链接正确。



我忘了提一些重要的事情:如果我使用unique_ptr到一个更简单的数据类型,例如一个字符串,它链接成功。例如:

  auto string1 = unique_ptr< string>(new string(20000,'S')); 
auto string2 = unique_ptr< string>(new string(20000,'A'));
string1 = std :: move(string2);

我也试图确保使用该变量,所以编译器不优化

编辑:我刚刚测试添加另一个外部函数接受 unique_ptr< string> ,我试着在上面的 string1 发送,也打破了!所以问题必须在生成的DLL之间,因为std :: move()在每个文件/类中工作良好。

解决方案

好吧,不知道它现在的相关程度,但我有完全相同的问题与C + + CLI和解决它与取值参考,而不是价值。我的意思是:
void setUniquePtr(unique_ptr && a,unique_ptr && b)



这种方式编译,虽然它不是一个干净的方式做事情。


I'm currently converting my instances of auto_ptr to unique_ptr, but I'm hitting an issue. It works great in the C++ part of the code, but when doing it in my managed C++/CLI layer (the software uses both C# and C++) I get link errors. It compiles fine, but it breaks at link time. There were never any issues with auto_ptr.

I'm currently using Visual Studio 2010. Does anybody know of any issues with using unique_ptr in C++/CLI?

I've tried to sum up my issue in a piece of code below, but please be aware that the code below actually compiles and works (I checked that the ownership of the pointers get moved properly). I'm not getting linking errors when compiling this, but the code below is pure C++ and not C++/CLI. I just wanted to have a minimal example of how the code is constructed so the linker error makes more sense to read.

#include "stdafx.h"
#include <vector>
#include <memory>
#include <utility>

using namespace std;

namespace Test {

template< class T >
struct LinAlgPoint3 {
  LinAlgPoint3() { x = y = z = 0; };

  union {
    struct {T x,y,z;} ;
    T data_[3];
  };
};

class ContainerClass
{
public:
  void setUniquePtr(
    unique_ptr< vector< LinAlgPoint3< float > > > newUniquePtr1 ,
    unique_ptr< vector< unsigned char > > newUniquePtr2 )
  {
    m_uniquePtr1 = move(newUniquePtr1);
    m_uniquePtr2 = move(newUniquePtr2);
  }

private:
  unique_ptr< vector< LinAlgPoint3< float > > > m_uniquePtr1;
  unique_ptr< vector< unsigned char > > m_uniquePtr2;
};

int main(int argc, char** argv)
{
  auto pos = unique_ptr< vector< LinAlgPoint3< float > > >( new vector< LinAlgPoint3< float > >() );
  auto name = unique_ptr< vector< unsigned char > >(new vector< unsigned char >());
  ContainerClass container;
  container.setUniquePtr(move(pos), move(name));
}

} //namespace Test

The error I get when linking is the following:

error LNK2028: unresolved token (0A0018A5) "private: __cdecl std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >(class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > const &)" (??0?$unique_ptr@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@U?$default_delete@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@@2@@std@@$$FAEAA@AEBV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >::<MarshalCopy>(class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > *,class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > *)" (?<MarshalCopy>@?$unique_ptr@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@U?$default_delete@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@@2@@std@@$$FSMXPEAV12@0@Z)
1>TestClass.obj : error LNK2028: unresolved token (0A0018A6) "private: __cdecl std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >(class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > const &)" (??0?$unique_ptr@V?$vector@EV?$allocator@E@std@@@std@@U?$default_delete@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@$$FAEAA@AEBV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >::<MarshalCopy>(class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > *,class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > *)" (?<MarshalCopy>@?$unique_ptr@V?$vector@EV?$allocator@E@std@@@std@@U?$default_delete@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@$$FSMXPEAV12@0@Z)
1>TestClass.obj : error LNK2019: unresolved external symbol "private: __cdecl std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >(class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > const &)" (??0?$unique_ptr@V?$vector@EV?$allocator@E@std@@@std@@U?$default_delete@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@$$FAEAA@AEBV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > >::<MarshalCopy>(class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > *,class std::unique_ptr<class std::vector<unsigned char,class std::allocator<unsigned char> >,struct std::default_delete<class std::vector<unsigned char,class std::allocator<unsigned char> > > > *)" (?<MarshalCopy>@?$unique_ptr@V?$vector@EV?$allocator@E@std@@@std@@U?$default_delete@V?$vector@EV?$allocator@E@std@@@std@@@2@@std@@$$FSMXPEAV12@0@Z)
1>TestClass.obj : error LNK2019: unresolved external symbol "private: __cdecl std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >(class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > const &)" (??0?$unique_ptr@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@U?$default_delete@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@@2@@std@@$$FAEAA@AEBV01@@Z) referenced in function "public: static void __clrcall std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > >::<MarshalCopy>(class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > *,class std::unique_ptr<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > >,struct std::default_delete<class std::vector<struct LinAlgPoint3<float>,class std::allocator<struct LinAlgPoint3<float> > > > > *)" (?<MarshalCopy>@?$unique_ptr@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@U?$default_delete@V?$vector@U?$LinAlgPoint3@M@Test@@V?$allocator@U?$LinAlgPoint3@M@Test@@@std@@@std@@@2@@std@@$$FSMXPEAV12@0@Z)
1>D:\Test\Test.dll : fatal error LNK1120: 4 unresolved externals

As you can see (if you can get through the incredibly horrible messages) there are some references to MarshalCopy, something that makes me worry that C++/CLI might not support unique_ptr yet.

The layout of the software is

C# executable -> C++/CLI translation layer (dll) -> C++ dll

So the C++ dll compiles fine using unique_ptr, but the C++/CLI dll is unable to link properly.

I forgot to mention something quite important: If I use unique_ptr to a simpler datatype, for instance a string, it links successfully. For example:

  auto string1= unique_ptr< string >(new string(20000, 'S'));
  auto string2 = unique_ptr< string >(new string(20000, 'A'));
  string1= std::move(string2);

and I've also tried to make sure to use the variable so the compiler doesn't optimize it away.

Edit: I've just tested adding another external function that accepts a unique_ptr<string>, and I tried sending in the above string1 and that breaks as well! So the issue must be between the generated DLLs, since the std::move() works well within each file/class.

解决方案

Well, don't know how relevant it is now, but I had exactly same problem with C++/CLI and solved it with taking r-value reference instead of value. I mean: void setUniquePtr(unique_ptr&& a, unique_ptr&& b)

This way it compiles though it's not a cleanest way to do things.

这篇关于在C ++ / CLI中使用unique_ptr时的链接器错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆