如何从"开始组..结束组"链接器选项构建文件列表

How to construct a list of files from the `start group ... end group` linker option

本文关键字:quot 选项 构建 文件 列表 链接 开始 结束      更新时间:2023-10-16

我已经按照这里的说明构建了 V8 静态库。现在我正在尝试使用它来创建示例 HelloWorld 应用程序。问题是文档没有说明我需要在示例项目中引用构建中的哪些文件。它们仅显示如何使用g++编译项目:

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/libicu{uc,i18n},src/inspector/libinspector}.a 
-Wl,--end-group -lrt -ldl -pthread -std=c++0x

我已经阅读了一些关于g++选项的信息,并假设从链接器选项构造的文件列表是我在编译时需要在项目中引用--start-group...--end-group。但是我不明白如何构建该文件列表。我以为会有这样的文件

out.gn/x64.release/obj/libv8_base
out.gn/x64.release/obj/libv8_libbase
...

但他们不在那里。相反,有文件夹:

out.gn/x64.release/obj/v8_base
out.gn/x64.release/obj/v8_libbase
out.gn/x64.release/obj/v8_external_snapshot
...

.obj文件。我错过了什么?

命令行片段:

-Wl,--start-group 
out.gn/x64.release/obj/{libv8_{base,libbase,external_snapshot,libplatform,libsampler},
third_party/icu/libicu{uc,i18n},src/inspector/libinspector}.a 
-Wl,--end-group

将在g++看到它之前被 shell 展开,并将成为:

-Wl,--start-group 
out.gn/x64.release/obj/libv8_base.a 
out.gn/x64.release/obj/libv8_libbase.a 
out.gn/x64.release/obj/libv8_external_snapshot.a 
out.gn/x64.release/obj/libv8_libplatform.a 
out.gn/x64.release/obj/libv8_libsampler.a 
out.gn/x64.release/obj/third_party/icu/libicuuc.a 
out.gn/x64.release/obj/third_party/icu/libicui18n.a 
out.gn/x64.release/obj/src/inspector/libinspector.a 
-Wl,--end-group

这将告诉g++请求链接器,ld,链接 所有静态库:

out.gn/x64.release/obj/libv8_base.a
out.gn/x64.release/obj/libv8_libbase.a
out.gn/x64.release/obj/libv8_external_snapshot.a
out.gn/x64.release/obj/libv8_libplatform.a
out.gn/x64.release/obj/libv8_libsampler.a
out.gn/x64.release/obj/third_party/icu/libicuuc.a
out.gn/x64.release/obj/third_party/icu/libicui18n.a
out.gn/x64.release/obj/src/inspector/libinspector.a

而且,由于要检查--start-group ... --end-group这组库以递归方式在符号解析中,直到 它不会产生新的未定义引用(而不是每个引用一次) 按顺序,默认情况下)

如果您的构建树不包含该组静态库,则 可能是您正在构建的 Git 分支不一致 以及您正在遵循的文档。在这种情况下,您可以查看 对于有问题的静态库 - 八个*.a文件 - 其他地方 在您的树中并替换:

out.gn/x64.release/obj/{libv8_{base,libbase,external_snapshot,libplatform,libsampler},
third_party/icu/libicu{uc,i18n},src/inspector/libinspector}.a 

包含您找到的库的显式绝对或相对文件名列表。然后 试试你的运气与构建。

如果您找不到任何候选人,那么您正在关注的文档 与您正在使用的构建树无可救药地失衡。