我是一个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
内联命名空间。
有人知道如何改变编译器的行为吗?
2条答案
按热度按时间wgx48brx1#
我自己解决了这个问题。(但我在建筑方面还有其他错误。)
问题是,我必须向
gn args
添加一个标志“is_clang = false”,因为绑定到v8的clang将编译其他类型的manglings到MSVS。如果我添加了标记,那么v8工具将使用您安装的cl.exe编译这些代码。
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是可能的,但现在呢?