首页 > 解决方案 > 手动链接时 Clang 不生成 profraw 文件

问题描述

我正在尝试clang使用llvm-covand的分析功能llvm-profdata。我用 CMake 进行了所有设置,但它没有default.profraw按预期生成。我已经手动尝试了这些步骤,发现如果我在生成目标文件和编译可执行文件之间拆分步骤,clang它不会生成default.profraw文件。

例如,以下作品:

$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a binoperator.cpp main.cpp
$ ./a.out
38
Done...
$ ls -al default.profraw
-rw-rw-r--. 1 marten marten 224 May 13 13:59 default.profraw

以下不起作用(这大致是 CMake 尝试做的):

$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o binoperator.cpp.o -c binoperator.cpp
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o main.cpp.o -c main.cpp
$ clang++ -o a.out binoperator.cpp.o main.cpp.o 
$ ./a.out
38
Done...
$ ls -al default.profraw
ls: cannot access 'default.profraw': No such file or directory

为什么?有什么区别?我怎样才能使第二种情况起作用?

亲切的问候,


附加信息:

#include "binoperator.h"

#include <iostream>

int main()
{
    BinOperator bo;

    int result = bo.add(5, 33);

    std::cout << result << std::endl;
    std::cout << "Done..." << std::endl;

    return 0;
}

#ifndef BINOPERATOR_H
#define BINOPERATOR_H

class BinOperator
{
public:
    int add(int a, int b) const;
};

#endif
#include "binoperator.h"

int BinOperator::add(int a, int b) const
{
    return (a + b);
}
$ clang --version
clang version 8.0.0 (Fedora 8.0.0-1.fc30)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

标签: c++clangclang++llvm-clang

解决方案


我发现在第二种情况下,-fprofile-instr-generate -fcoverage-mapping选项也应该在链接调用中指定clang++

$ clang++ -O0 -fprofile-instr-generate -fcoverage-mapping binoperator.cpp.o main.cpp.o -o a.out

在 CMake 中,这可以通过target_link_options().


推荐阅读