手动链接时 Clang 不生成 profraw 文件

Mar*_*nBE 5 c++ clang llvm-clang clang++

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

\n\n

例如,以下作品:

\n\n
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a binoperator.cpp main.cpp\n$ ./a.out\n38\nDone...\n$ ls -al default.profraw\n-rw-rw-r--. 1 marten marten 224 May 13 13:59 default.profraw\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o binoperator.cpp.o -c binoperator.cpp\n$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o main.cpp.o -c main.cpp\n$\xc2\xa0clang++ -o a.out binoperator.cpp.o main.cpp.o \n$\xc2\xa0./a.out\n38\nDone...\n$ ls -al default.profraw\nls: cannot access \'default.profraw\': No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

亲切的问候,

\n\n

\n\n
\n\n

附加信息:

\n\n
    \n
  • 主程序
  • \n
\n\n
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a binoperator.cpp main.cpp\n$ ./a.out\n38\nDone...\n$ ls -al default.profraw\n-rw-rw-r--. 1 marten marten 224 May 13 13:59 default.profraw\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 二进制操作符.h
  • \n
\n\n
$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o binoperator.cpp.o -c binoperator.cpp\n$ clang++ -g -O0 -fprofile-instr-generate -fcoverage-mapping -std=gnu++2a -o main.cpp.o -c main.cpp\n$\xc2\xa0clang++ -o a.out binoperator.cpp.o main.cpp.o \n$\xc2\xa0./a.out\n38\nDone...\n$ ls -al default.profraw\nls: cannot access \'default.profraw\': No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 二元运算符.cpp
  • \n
\n\n
#include "binoperator.h"\n\n#include <iostream>\n\nint main()\n{\n    BinOperator bo;\n\n    int result = bo.add(5, 33);\n\n    std::cout << result << std::endl;\n    std::cout << "Done..." << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
$ clang --version\nclang version 8.0.0 (Fedora 8.0.0-1.fc30)\nTarget: x86_64-unknown-linux-gnu\nThread model: posix\nInstalledDir: /usr/bin\n
Run Code Online (Sandbox Code Playgroud)\n

Mar*_*nBE 4

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

$ clang++ -O0 -fprofile-instr-generate -fcoverage-mapping binoperator.cpp.o main.cpp.o -o a.out
Run Code Online (Sandbox Code Playgroud)

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