我正在尝试运行此处引用的示例 V8 嵌入式应用程序:[https://v8.dev/docs/embed][1]。 (hello-world.cc)
我已经从源代码构建了 v8,并且可以找到所有库,例如 libv8_monolith、libv8_libbase、libv8_libplatform 。
当我执行命令时
clang++ -I. -Iinclude samples/hello-world.cc -o hello_world -fno-rtti -lv8_monolith -lv8_libbase -lv8_libplatform -ldl -Lout.gn/x64.release.sample/obj/ -pthread -std=c++17 -DV8_COMPRESS_POINTERS -DV8_ENABLE_SANDBOX
我在链接时遇到以下错误。它找不到符号。
ld: Undefined symbols: v8::platform::NewDefaultPlatform(int, v8::platform::IdleTaskSupport, v8::platform::InProcessStackDumping, std::__1::unique_ptr<v8::TracingController, std::__1::default_delete<v8::TracingController>>, v8::platform::PriorityMode), referenced from:
_main in hello-world-c8e5eb.o std::__Cr::__shared_weak_count::__get_deleter(std::type_info const&) const, referenced from:
vtable for std::__Cr::__shared_ptr_pointer<v8::internal::BackingStore*, std::__Cr::default_delete<v8::internal::BackingStore>, std::__Cr::allocator<v8::internal::BackingStore>> in libv8_monolith.a[57](api.o) ...... ......
[More lines]
clang: error: linker command failed with exit code 1
操作系统:macOS Sonoma 14.3
默认情况下,V8 链接到其自己的捆绑副本
libc++
。这就是您按照 v8.dev/docs/build
上的便捷说明进行操作所获得的结果。针对 libc++ 构建 V8 要求您将嵌入应用程序也链接到 libc++(匹配版本),这是完全可行的,但可能不方便,特别是如果您有其他依赖项和约束。
为了使嵌入更容易,请按照
v8.dev/docs/embed
中的说明进行操作,包括其中的构建说明。那里列出的 v8.gen.py
步骤会生成一个构建配置,该配置禁用捆绑的 libc++ 的使用,而是链接到系统的 C++ 库(在大多数系统上可能是 libstdc++
)。gn args out/x64.release
,然后在打开的编辑器中添加 use_custom_libcxx = false
。保存并退出(以重新生成构建文件),然后重新编译 V8。然后链接它应该 Just Work™(至少就 C++ 标准库而言)。
旁注:在任何地方或任何地方,提出问题时,具体和精确会有所帮助。
发布您运行的确切命令。当您实际上一直在遵循不同的工作流程时,请勿从一个记录的工作流程中复制粘贴命令行。
(在这种情况下:
-Lout.gn/x64.release.sample/obj/
部分和问题的开头看起来像是您遵循了v8.dev/docs/embed
,这应该为您提供了所需的构建配置;但是错误消息和您后来的评论澄清了您实际上遵循了v8.dev/docs/build
,这个论点本来就是 -Lout/x64.release/obj/
。)
当有人询问您的
args.gn
文件的内容时,发布该文件的内容,而不是运行一些可能模糊相关的命令并报告您在那里所做的部分观察。当有人自愿帮助您时,请满足他们的要求,以便能够帮助您。
理想情况下,发布完整重现说明,包括重现问题所需的任何代码以及需要运行的每个命令。如果它超出了您想要解决的问题,请上传相关文件,例如作为 GitHub 要点或项目。不要让人们猜测您可能做了什么或意味着什么。