我的 BUILD.gn 文件的一部分配置如下:
config("test") {
cflags = [
"-std=c++17",
"-fvisibility=hidden",
]
cflags_cc = [ "-fvisibility-inlines-hidden" ]
ldflags = []
if (enable_coverage) {
# clang coverage options:
cflags += [
"-fprofile-arcs",
"-ftest-coverage",
]
ldflags += [ "--coverage" ]
cflags += [
"-mllvm",
"-limited-coverage-experimental=true",
"-fno-use-cxa-atexit",
]
}
}
我有一些使用
protobuffer
和 libprotobuf
库的测试代码。我还隐藏了 libprotobuf
中的所有符号,只公开了我需要使用的功能。当 enable_coverage
为 false
时,代码可以正常编译,但是当 enable_coverage
为 true
时,会出现如下链接器错误:
ld.lld:错误:未定义符号:google::protobuf::RepeatedField::elements() const
确实我没有暴露
google::protobuf::RepeatedField<int>::elements() const
函数符号,但是我的测试代码根本没有改变,也就是说enable_coverage
是false
还是true
都是一样的。那么为什么只有当 enable_coverage
是 true
时才会发生这个链接器错误?
当我暴露了
google::protobuf::RepeatedField<int>::elements() const
中的libprotobuf
符号后,问题就解决了。但我真正想知道的是为什么像-fprofile-arcs
、-ftest-coverage
和--coverage
这样的参数会影响测试代码并导致新的链接器要求。谢谢你。