GN构建系统中如何让共享库不链接指定依赖且保留头文件路径
GN构建下仅导入依赖库头文件不执行链接的实现方案
你遇到的问题核心是需要拆分「头文件路径传递」和「库链接」两个强绑定在deps/public_deps里的逻辑,GN原生提供了独立的config机制处理这类需求,步骤如下:
- 第一步:给libA新增独立的头文件导出配置
在libA对应的BUILD.gn中新增单独的config节点,只声明头文件路径,不要绑定编译产物链接逻辑:
# libA 对应的BUILD.gn内容 shared_library("libA") { sources = [ "xxx.cc", "yyy.cc" ] # 原有编译配置保持不变 include_dirs = [ "include" ] # 对外导出头文件配置,所有依赖这个config的目标都会自动拿到头文件路径 public_configs = [ ":libA_header_config" ] } config("libA_header_config") { include_dirs = [ "include" ] # 若libA需要对外传递其他编译宏、flag,也可以统一加在这里 }
- 第二步:调整libS的依赖配置
libS的deps只保留需要链接的libB,单独依赖libA的头文件配置即可:
# libS 对应的BUILD.gn内容 shared_library("libS") { sources = [ "sss.cc", "ttt.cc" ] # libB需要链接进libS,正常放在deps里 deps = [ "//path/to/libB:libB" ] # 仅引入libA的头文件配置,不会触发libA的链接逻辑 public_configs = [ "//path/to/libA:libA_header_config" ] }
- 第三步:主程序正常配置依赖
主程序main的BUILD.gn中正常添加libA的依赖即可,运行时libA的符号会正常暴露给libS调用:
# main 对应的BUILD.gn内容 executable("main") { sources = [ "main.cc" ] deps = [ "//path/to/libS:libS", "//path/to/libA:libA" ] }
补充说明
如果项目结构简单,也可以直接在libS的配置中手动指定libA的头文件路径:
shared_library("libS") { include_dirs = [ "//path/to/libA/include" ] # 其他配置不变 }
但更推荐用public_configs的方案,后续libA的头文件路径、编译参数变更时只需要修改自身配置,不需要同步修改所有依赖它的目标配置,维护成本更低。
内容的提问来源于stack exchange,提问作者Hui.Li
相关产品推荐
相关产品推荐

