未能在原生 Dart 扩展中链接 v8

Posted

技术标签:

【中文标题】未能在原生 Dart 扩展中链接 v8【英文标题】:Failure to link v8 in a native Dart extension 【发布时间】:2017-08-04 23:11:52 【问题描述】:

我正在尝试在 Dart native extension 中使用 v8。

v8 getting started guide 表示要像这样编译 hello world 示例。

g++ -I. -Iinclude samples/hello-world.cc -o hello-world -Wl,--start-group \
out.gn/x64.release/obj/libv8_base,libbase,external_snapshot,libplatform,libsampler,\
third_party/icu/libicuuc,i18n,src/inspector/libinspector.a \
-Wl,--end-group -lrt -ldl -pthread -std=c++0x

Dart 说要像这样编译原生扩展:

g++ -fPIC -Ipath to SDK include directory -DDART_SHARED_LIB -c sample_extension.cc

gcc -shared -m32 -Wl,-soname,libsample_extension.so -o libsample_extension.so sample_extension.o

这是我想出的混合动力

g++ -fPIC -Ipath to SDK include directory -Iinclude -DDART_SHARED_LIB -c sample_extension.cc -std=c++0x

gcc -shared -Wl,-soname,libsample_extension.so -Wl,--start-group out.gn/x64.release/obj/libv8_base,libbase,external_snapshot,libplatform,libsampler,third_party/icu/libicuuc,i18n,src/inspector/libinspector.a -Wl,--end-group  -o libsample_extension.so sample_extension.o -lrt -ldl -pthread -std=c++0x

但是,在尝试运行我的应用程序时,我收到一条错误消息,指出 v8 未正确链接。

dart: symbol lookup error: /mnt/c/Users/zvacu/Documents/Code/Dart/require/libsample_extension.so: undefined symbol: _ZN2v82V828InitializeICUDefaultLocationEPKcS2_

使用提供的 hello world 示例时,我可以设法正确链接它。

【问题讨论】:

【参考方案1】:

做一些研究,似乎问题出在第二个命令的 -shared 属性上。您需要注意 C++ 和共享库,因此请通过以下方式检查您的库是否获取所有依赖项:

ldd /mnt/c/Users/zvacu/Documents/Code/Dart/require/libsample_extension.so

之后你会得到一个所有依赖的列表,然后你需要搜索是否缺少任何人。

如果这不能回答您的问题,请参阅此相关答案:

Undefined symbol when loading a shared library

【讨论】:

以上是关于未能在原生 Dart 扩展中链接 v8的主要内容,如果未能解决你的问题,请参考以下文章

Air ANE - 链接原生 so 库

winsock 的 v8 发布模式链接器错误

未能使用 id3 库链接示例程序

未能加载文件或程序集“DevExpress.Data.v8.1 求解答 ~!急

如何在 Dart 中仅使用级联或链式调用干净地映射/排序/折叠/排序/扩展?

SyncNavigator V8.4.1企业版下载链接