如何从`start group ... end group`链接器选项构造文件列表

时间:2017-05-08 19:10:26

标签: c++ g++

我按照here的说明构建了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个文件。我错过了什么?

1 个答案:

答案 0 :(得分:1)

命令行片段:

 -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 \

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

如果您找不到任何候选人,那么您要遵循的文档 与你正在使用的构建树完全没有关系。