我想使用GCOV进行代码覆盖,但测试将在另一台机器上运行.因此,可执行文件中.gcda文件的硬连线路径将无法正常工作.
为了改变这个默认目录我可以使用GCOV_PREFIX和GCOV_PREFIX_STRIP ENV瓦尔,因为它说这里.
这是我用过的命令:
$ export GCOV_PREFIX="/foo/bar"
$ export GCOV_PREFIX_STRIP="3"
$ gcc main.c -fprofile-arcs -ftest-coverage
$ strings a.out | grep gcda
/home/calmarius/blahblah/main.c.gcda
Run Code Online (Sandbox Code Playgroud)
路径保持不变.有人有这方面的经验吗?
Smi*_*Boy 14
************ARRRRGGGGGHHHHH************
运行代码时会考虑环境变量.
在我阅读的有关如何重新定位输出的每个文档中,显然缺少这一句话!
事实上,请允许我稍微扩展一下这个答案.
GCOV_PREFIX是一个运行时 - 与构建时相关 - 环境变量,并确定写入gcov输出文件(*.gcda)的根目录.
GCOV_PREFIX_STRIP = X也是一个运行时变量,具有从目标文件中找到的路径中剥离X元素的效果(字符串XXXX.o)
这意味着:
构建项目时,目标文件将使用完整路径写入每个源文件的位置,该文件负责嵌入其中的每个目标文件.
所以,想象一下你在一个像这样的目录中写一个可执行的MyApp和一个库MyLib:
/MyProject
|-MyApp
|--MyLib
Run Code Online (Sandbox Code Playgroud)
注意MyLib是MyApp的子目录
假设MyApp有2个源文件,MyLib有3个
使用"-coverage"标志构建后,您将为每个目标文件生成5个.gcno文件,1个.
嵌入在MyApp的.o文件中将是绝对路径**/MyProject/MyApp/**a_source_file.cpp同样,嵌入在.o文件中的MyLib将是路径**/MyProject/MyApp/MyLib/**another_source_file.cpp
现在,假设您和我一样,将这些文件移动到一台完全不同的机器上,该机器具有与构建它们不同的目录结构.在我看来,目标机器实际上是一个完全不同的架构.我在那台机器上部署到/ some/deploy/path not/MyProject.
如果您只是运行应用程序,gcov数据将尝试将相应的.gcda文件写入项目中每个目标文件的/ MyProject/MyApp和/ MyProject/MyApp/MyLib,因为这是.o文件指示的路径,之后所有,MyApp和MyLib只是归档在一起的.o文件的集合,还有一些其他魔法来修复功能指针和东西.
可能是,那些目录不存在,你可能没有以root身份运行(是吗?),所以这些目录也不会被创建.Soooo ..你不会在部署位置/ my/deploy/path中看到任何gcda文件.
这完全令人困惑,对吧!?!??!?!?!?
这是GCOV_PREFIX和GCOV_PREFIX_STRIP进来的地方.
(BAM!拳击前额)你需要指示****运行时****.o文件中的嵌入路径不是你想要的.您想要"删除"某些路径,并将其替换为deploy目录.
因此,您通过GCOV_PREFIX =/some/deploy/path设置部署目录,并且要从生成的.gcda路径中剥离/ MyProject,以便设置GCOV_PREFIX_STRIP = 1
设置这两个环境变量后,运行您的应用程序,然后查看/ some/deploy/path/MyApp和/ some/deploy/path/MyApp/MyLib,看看5个gcda文件奇迹般地出现,每个对象一个文件.
注意:如果您没有源代码构建,问题就更复杂了..o指向源,但gcda将相对于构建目录编写.