************ ARRRRGGGGGHHHHH ************
请为马特的答案投票。
运行代码时会考虑环境变量。
我读过的关于如何重新定位输出的每份文档中显然都缺少这句话!
事实上,请允许我稍微扩展一下这个答案。
GCOV_PREFIX 是一个运行时- 与构建时间相反 - 环境变量并确定写入 gcov 输出文件 (*.gcda) 的根目录。
GCOV_PREFIX_STRIP=X 也是一个运行时变量,具有从目标文件(字符串 XXXX.o)中找到的路径中剥离 X 元素的效果
这意味着:
当您构建您的项目时,目标文件将使用每个源文件位置的完整路径写入,这些源文件负责嵌入其中的每个目标文件。
因此,假设您正在像这样的目录结构中编写可执行的 MyApp 和库 MyLib:
/MyProject
|-MyApp
|--MyLib
注意 MyLib 是 MyApp 的子目录
假设 MyApp 有 2 个源文件,而 MyLib 有 3 个
使用“-coverage”标志构建后,您将生成 5 个 .gcno 文件,每个目标文件 1 个。
嵌入在 MyApp 的 .o 文件中将是绝对路径 **/MyProject/MyApp/**a_source_file.cpp 同样,嵌入在 MyLib 的 .o 文件中将是路径 **/MyProject/MyApp/MyLib/** another_source_file.cpp
现在,假设您像我一样,将这些文件移动到完全不同的机器上,其目录结构与它们的构建位置不同。在我的例子中,目标机器实际上是一个完全不同的架构。我在该机器上部署到 /some/deploy/path 而不是 /MyProject。
如果您只是简单地运行该应用程序,gcov 数据将尝试将相应的 .gcda 文件写入项目中的每个目标文件的 /MyProject/MyApp 和 /MyProject/MyApp/MyLib,因为这是 .o 文件指示的路径,并且之后所有,MyApp 和 MyLib 只是一起存档的 .o 文件的集合,还有一些其他的魔法来修复函数指针和东西。
很有可能,这些目录不存在,并且您可能没有以 root 身份运行(是吗?),因此也不会创建这些目录。Soooo .. 您不会在部署位置 /my/deploy/path 中看到任何 gcda 文件。
这完全令人困惑,对吧!?!??!?!?!?
这就是 GCOV_PREFIX 和 GCOV_PREFIX_STRIP 的用武之地。
(BAM!拳头击中额头)您需要指示 ****runtime**** .o 文件中的嵌入路径并不是您真正想要的。您想“剥离”一些路径,并将其替换为部署目录。
因此,您通过 GCOV_PREFIX=/some/deploy/path 设置部署目录,并且您想从生成的 .gcda 路径中删除 /MyProject,因此您设置 GCOV_PREFIX_STRIP=1
设置这两个环境变量后,您运行您的应用程序,然后查看 /some/deploy/path/MyApp 和 /some/deploy/path/MyApp/MyLib ,瞧,奇迹般地出现了 5 个 gcda 文件,每个对象一个文件。
注意:如果您使用源代码构建,问题会更加复杂。.o 指向源,但 gcda 将相对于构建目录写入。