Visual Studio 在项目中使用v8.dll时无法解析外部符号

jhiyze9q  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(299)

我是一个C项目的新手,可能对C项目的基础知识不太了解。

  • [环境]*
  • windows 10
  • Python 2.7.18语言
  • VS 2022的开发人员命令提示符
  • Visual Studio 2022社区

我目前正在与使V8引擎作为一个DLL和使用它。
我已经建立了V8引擎作为一个DLL成功,但使用它,我面临着"无法解析外部符号"的错误。
详情:

error LNK2019: unresolved external symbol "class std::unique_ptr<class v8::Platform,struct std::default_delete<class v8::Platform> > __cdecl v8::platform::NewDefaultPlatform(int,enum v8::platform::IdleTaskSupport,enum v8::platform::InProcessStackDumping,class std::unique_ptr<class v8::TracingController,struct std::default_delete<class v8::TracingController> >)" (?NewDefaultPlatform@platform@v8@@YA?AV?$unique_ptr@VPlatform@v8@@U?$default_delete@VPlatform@v8@@@std@@@std@@HW4IdleTaskSupport@12@W4InProcessStackDumping@12@V?$unique_ptr@VTracingController@v8@@U?$default_delete@VTracingController@v8@@@std@@@4@@Z) referenced in function "public: __cdecl ezv8::Platform::Impl::Impl(void)" (??0Impl@Platform@ezv8@@QEAA@XZ)

我已经研究了一些C++ mangling和compailer行为的东西。
我注意到v8_libplatform.dll.lib文件包含其他类型的损坏符号,如下所示。

?NewDefaultPlatform@platform@v8@@YA?AV?$unique_ptr@VPlatform@v8@@U?$default_delete@VPlatform@v8@@@__1@std@@@__1@std@@HW4IdleTaskSupport@12@W4InProcessStackDumping@12@V?$unique_ptr@VTracingController@v8@@U?$default_delete@VTracingController@v8@@@__1@std@@@45@@Z = ?NewDefaultPlatform@platform@v8@@YA?AV?$unique_ptr@VPlatform@v8@@U?$default_delete@VPlatform@v8@@@__1@std@@@__1@std@@HW4IdleTaskSupport@12@W4InProcessStackDumping@12@V?$unique_ptr@VTracingController@v8@@U?$default_delete@VTracingController@v8@@@__1@std@@@45@@Z (class std::__1::unique_ptr<class v8::Platform,struct std::__1::default_delete<class v8::Platform> > __cdecl v8::platform::NewDefaultPlatform(int,enum v8::platform::IdleTaskSupport,enum v8::platform::InProcessStackDumping,class std::__1::unique_ptr<class v8::TracingController,struct std::__1::default_delete<class v8::TracingController> >))

如您所见,.lib文件包含名称空间为__1的符号。
我发现了为什么这个文件包含这个。一个捆绑的clang编译器编译std命名空间与内联命名空间__1,但我不知道如何改变编译没有__1内联命名空间。
有人知道如何改变编译器的行为吗?

wgx48brx

wgx48brx1#

我自己解决了这个问题。(但我在建筑方面还有其他错误。)
问题是,我必须向gn args添加一个标志“is_clang = false”,因为绑定到v8的clang将编译其他类型的manglings到MSVS。
如果我添加了标记,那么v8工具将使用您安装的cl.exe编译这些代码。

vmjh9lq9

vmjh9lq92#

我在v8::platform::NewDefaultPlatform()函数以及其他一些方法如v8::Context::Scope::Scope()v8::Context::Scope::~Scope()等中遇到了完全相同的链接问题。原因与名称损坏无关,看起来像clang-cl(默认情况下在Windows平台上的v8/chromium中使用)使用与cl相同的名称mangling。所有这些方法都在头文件中定义,因此它们实际上是内联的。clang-cl使用/Zc:DllexportInlines-编译器选项,该选项不从DLL导出内联(有关详细信息,请参见https://reviews.llvm.org/D51340?id=172304)。
很久以前就提出了在cl编译器中添加/Zc:DllexportInlines选项的请求:https://developercommunity.visualstudio.com/t/implement-zcdllexportinlines-aka-fvisibility-inlin/374754,但是到目前为止,cl版本19.34.31937仍然不支持它。
因此,如果不修改v8/chromium头文件(这从来都不好),我看不出有什么办法可以将v8 DLL与Microsoft的cl编译器一起使用。
至于使用is_clang=false gn参数构建没有clang的v8,我想知道这是否真的可能。有很多编译器选项,如-Wno-unused-const-variable-Wno-unused-function,它们不受cl支持,而是无条件地添加到gn构建文件中。我记得几年前使用cl构建chrome是可能的,但现在呢?

相关问题