如何在GN构建系统中为依赖库添加'-whole-archive'链接参数
GN构建系统添加whole-archive链接参数的实现方案
GN原生支持你需要的链接配置,不需要手动拼接复杂的链接参数,具体实现方式如下:
方案1:优先使用原生whole_archive_deps配置(推荐)
GN专门提供了whole_archive_deps配置项用于标记需要全量链接的静态库依赖,同时默认会将所有普通deps的静态库自动放入--start-group和--end-group区间处理循环依赖,完全匹配你的需求:
shared_library("my") { output_name = "my" # 普通依赖libA、libB会自动被包裹在--start-group与--end-group范围内 deps = [ "//path/to/libA:target_name", "//path/to/libB:target_name", ] # 标记为whole_archive_deps的libC会自动被包裹在-whole-archive与-no-whole-archive范围内 whole_archive_deps = [ "//path/to/libC:target_name", ] # 其余自定义配置按需添加即可 }
该方案的优势是GN会自动处理依赖的传递关系,如果libC本身还有其他依赖,也会被自动添加到正确的链接顺序位置,不会出现符号丢失的问题。
方案2:手动拼接ldflags(仅适用预制静态库场景)
如果你要链接的libC是外部预制的静态库,不是通过GN目标编译生成的,可以直接在ldflags里手动指定参数顺序:
shared_library("my") { output_name = "my" deps = [ "//path/to/libA:target_name", "//path/to/libB:target_name", ] # 手动指定预制静态库的whole-archive包裹逻辑 ldflags = [ "-Wl,-whole-archive", "//third_party/prebuilt/libC.a", "-Wl,-no-whole-archive", ] }
配置完成后可以通过查看生成的ninja构建文件中的链接命令,确认参数顺序是否符合预期。
内容的提问来源于stack exchange,提问作者Hui.Li
相关产品推荐
相关产品推荐

