背景
生成静态库时依赖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