gn静态库编译问题

背景

生成静态库时依赖source_set,生成的静态库文件只有几十B。从文件大小很容易发现生成的静态库有问题,如果将此静态提供给其他项目使用,肯定不能正常编译。但同一项目中依赖此静态库生成的可执行文件能正常运行。

静态库依赖的两种方式

生成静态库有两种依赖方式,如下

  • 直接依赖源码文件
  • 依赖源码生成的source_set

具体示例如下,其中demo_static1直接依赖源码,生成的静态库文件为8.1KB;demo_static2依赖的是源码生成的source_set配置,生成的静态库文件88B。
由两种依赖方式生成的静态库文件大小可知,直接依赖源码文件生成的库文件是正常的。直接将demo_static1单独复制到其他项目也可以进行编译;如果将demo_static2单独复制到其他项目可能就不能正常编译了,因为它不是完整的静态库文件。但,在该项目中,可执行文件配置依赖demo_static1或demo_static2都是可以正常运行的,demo_static2.a只是编译过程的中间产物,最终会根据demo_static2.a中的信息找到其他依赖项打包到最终产物中。

config("demo_config"){
    include_dirs = ["."]
}

source_set("demo_sources"){
    sources = [ "demo.cpp" ]
    public_configs = [":demo_config"]
}

static_library("demo_static1"){
    sources = [ "demo.cpp" ]
    public_configs = [":demo_config"]
}

static_library("demo_static2"){
    deps = [ ":demo_sources"  ]
    public_configs = [":demo_config"]
}

两种方式

client@pc % ls -lh out/obj/third_party/demo/libdemo_static1.a
-rw-r--r--  1 client  staff   8.1K Aug  5 22:38 out/obj/third_party/demo/libdemo_static1.a
client@pc % ls -lh out/obj/third_party/demo/libdemo_static2.a
-rw-r--r--  1 client  staff    88B Aug  5 22:38 out/obj/third_party/demo/libdemo_static2.a

demo_static.ninja文件中关于生成libdemo_static1.a的规则,由demo.o生成。

build obj/third_party/demo/libdemo_static1.a: alink obj/third_party/demo/demo_static1/demo.o

demo_static1.ninja文件中关于生成libdemo_static2.a的规则,由demo_sources.stamp生成,demo_sources.stamp内部为空。

build obj/third_party/demo/libdemo_static2.a: alink || obj/third_party/demo/demo_sources.stamp

依赖source_set生成完整静态库

依赖source_set的静态库,想生成完整的静态库只需要添加 complete_static_lib = true即可。

static_library("demo_static2"){
    deps = [ ":demo_sources"  ]
    public_configs = [":demo_config"]
    complete_static_lib = true
}

查看添加此配置后的ninja文件内容如下,将依赖的demo_sources/demo.o也给依赖进来了。

build obj/third_party/two/libtwo_static.a: alink obj/third_party/two/two_sources/two.o || obj/third_party/two/two_sources.stamp
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值