clang代码覆盖函数的覆盖参数改变了代码逻辑?

问题描述 投票:0回答:0

我的 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
这样的参数会影响测试代码并导致新的链接器要求。谢谢你。

c++17 protocol-buffers clang++ protobuf-c gn
© www.soinside.com 2019 - 2024. All rights reserved.