我正在尝试首次将C++与clang 6集成在一起,并一直遵循this指南。

我成功编译了二进制文件,生成了.profraw文件,并生成了.profdata文件,如步骤1、2和3a所述。但是,当我尝试按3b中所述创建面向行的​​覆盖率报告时,会收到以下消息:

error: build/debug/dane: Failed to load coverage: No coverage data found

检查.profraw文件后,我发现它为空。我尝试稍微更改一下代码并再次运行,但是生成的.profraw始终为空。

我的main.cpp文件:

#include <iostream>

int main(int argc, char **argv) {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

我的SConstruct文件:


env = Environment(CXX='clang++', CXXFLAGS=['-Wall', '-g', '-O0'], LINKFLAGS=['-fprofile-instr-generate', '-fcoverage-mapping'])
env.Program(target='build/debug/dane', source=['src/main.cpp'])


命令行输出:

➤ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
clang++ -o src/main.o -c -Wall -g -O0 src/main.cpp
clang++ -o build/debug/dane -fprofile-instr-generate -fcoverage-mapping src/main.o
scons: done building targets.
➤ build/debug/dane
Hello, World!
➤ llvm-profdata merge -sparse default.profraw -o default.profdata
➤ llvm-cov show build/debug/dane -instr-profile=default.profdata
error: build/debug/dane: Failed to load coverage: No coverage data found

我希望default.profraw文件保留有意义的覆盖率结果,并且不知道为什么它为空。

最佳答案

终于解决了。
最初,我将-fprofile-instr-generate -fcoverage-mapping标志指定为CXXFLAGS,但是它没有用,所以我知道它们是链接器标志,并将其移至LINKFLAGS(这导致这篇文章很沮丧)。
显然,这些标志需要同时显示为编译标志和链接器标志,以使整个程序正常工作。
我还尝试检查您是否可以在编译器和链接器之间分配标志,但是没有成功。

10-08 18:50