c++ - 手动链接时 Clang 不生成 profraw 文件
问题描述
我正在尝试clang
使用llvm-cov
and的分析功能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;
}
- 二进制运算符.h
#ifndef BINOPERATOR_H
#define BINOPERATOR_H
class BinOperator
{
public:
int add(int a, int b) const;
};
#endif
- 二进制运算符.cpp
#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
解决方案
我发现在第二种情况下,-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()
.
推荐阅读
- haskell - 为什么我的 Haskell 命令行程序没有从 Vim Bang 获得参数?
- javascript - 如何链接连续的 AJAX 调用并在它们之间传递值?
- angular - 角度路由器延迟加载:以相同路径开头的两个不同模块
- java - 警报管理器在除周日之外的每天特定时间推送通知,并在触发时禁用推送以显示
- azure - 使用现有应用程序进行 Azure AD 身份验证
- javascript - 根据其中的文本更改元素的颜色
- scala - 在 Scala 中使用参数动态实例化对象 - asInstanceOf 不接受参数
- c++ - 可以将容器的复制构造函数定义为不可复制值类型的删除吗?
- d3.js - 用 d3js 计算螺旋分段
- javascript - 平滑滚动以锚定在相同或不同页面上(jQuery)